【问题标题】:Laravel - delete whole collectionLaravel - 删除整个集合
【发布时间】:2019-02-22 03:54:24
【问题描述】:

我有文章的图片,当我更新文章时,我想检查图片是否相同,如果不是,我想删除它们,但如果可能的话,我想删除整个集合查询,类似于我在$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();
    }

【问题讨论】:

    标签: php laravel


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我会补充一点:如果你和我一样,用旧版本的 laravel (5.1.X) 运行新版本的 php (7.2.X) 而->delete() 不是正常工作,它是bug
    【解决方案2】:

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

    课堂练习.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
    }
    

    (想象一下,您的文章 == 我的讲座,而您的媒体 == 我的练习)

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

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多