Laravel - 删除整个集合

新手上路,请多包涵

我有文章的图像,当我更新文章时,我想检查图像是否相同,如果不相同,我想删除它们,但如果可能的话,我想删除整个集合而无需其他查询,有些东西就像我在下面的代码中所拥有的 $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();
    }

原文由 Ludwig 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 324
2 个回答

如果不进行查询,您就无法从数据库中删除。

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

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

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

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

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

原文由 Sigismund 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您链接了模型,则可以。

类Exercise.php:

 /**
 * Exercise belongs to exactly one lecture
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */

public function lecture()
{
    return $this->belongsTo('\App\Lecture');
}

和课堂 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
}

(假设你的文章 == 我的演讲,你的媒体 == 我的练习)

当然,首先你必须在你的数据库中正确设置外键并以这种方式链接你的模型。

原文由 MCFreddie777 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏