拉拉维尔 - 删除整个系列

2022-08-30 15:54:19

我有文章的图像,当我更新文章时,我想检查图像是否相同,如果没有,我想删除它们,但如果有可能,我想删除整个集合而无需另一个查询,就像我在下面的代码中一样。这是我的函数:$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();
    }

答案 1

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

您必须像这样提出新的请求:

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

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

如果我们谈论的是包含 100 个项目的集合,则可以按如下方式优化查询:

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

答案 2

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

课堂练习.php:

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

public function lecture()
{
    return $this->belongsTo('\App\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
}

(想象一下,你的文章==我的演讲,你的媒体==我的Exerises)

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


推荐