Laravel - 删除整个集合

时间:2016-06-30 10:21:06

标签: php 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();
    }

2 个答案:

答案 0 :(得分:20)

您无法在不进行查询的情况下从数据库中删除。

你必须提出这样的新请求:

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

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

如果我们谈论使用100个项目进行收集,您可以像这样优化查询:

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

答案 1 :(得分:1)

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

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
}

(想象一下,您的文章==我的演讲,而您的媒体==我的锻炼)

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