Laravel -删除整个集合


Laravel - delete whole collection

我有文章的图像,当我更新文章时,我想检查图像是否相同,如果不是,我想删除它们,但如果可能的话,我想删除整个集合而不需要另一个查询,就像我在$images->delete();下面的代码中所拥有的一样。这是我的功能:

$images = Media::where('article_id', $article->id)->get();
    foreach($images as $image) {
        $article_images[] = $image->original_name;
    }
    foreach($files as $file) {
      $filePathArr = explode('/', $file);
      $fileName = array_pop($filePathArr);
      $originalFile = explode('-', $fileName);
      $originalFileName = array_pop($originalFile);
      $newFiles[] = $originalFileName;
    }
    if ($newFiles != $article_images){
      $images->delete();
    }

不进行查询就不能从数据库中删除。

你将不得不像这样提出新的请求:

Media::where('article_id', $article->id)->delete();

这只是一个简单的查询,所以不应该有任何性能损失。

如果我们正在讨论包含100个项目的集合,您可以这样优化查询:

Media::whereIn('id', $images->pluck('id'))->delete(); 

如果你有你的模型链接,你可以。

类Exercise.php:

/**
 * Exercise belongs to exactly one lecture
 *
 * @return 'Illuminate'Database'Eloquent'Relations'BelongsTo
 */
public function lecture()
{
    return $this->belongsTo(''App'Lecture');
}

和Class Lecture.php:

/**
 * Gets all the exercises asociated to this lecture
 * @return 'Illuminate'Database'Eloquent'Relations'HasMany
 */
public function exercises()
{
    return $this->hasMany(''App'Exercise');
}

然后你可以在你的控制器中输入:

public function delete($id, DeleteLectureRequest $request)
{
        $lecture = Lecture::findOrFail($id);
        $lecture->exercises()->delete();      // easy
}

(想象你的文章==我的讲座,你的媒体==我的练习)

当然,首先你必须在DB中设置适当的外键,并以这种方式链接你的模型。

我将通过调用Model::get()Model::all()后执行以下操作来删除整个集合

$posts = Post::all();
// Logic
// More logic
$posts->map->delete();