使用Eloquent遍历收集和更新记录

时间:2016-05-29 00:39:55

标签: php laravel eloquent

我正在使用eloquent从我的数据库中提取App\Post列表并从我的服务器中删除它们的文件内容。 我正在遍历列表并处理删除操作,成功后我想将值存储到相应的App \ Post但是我收到此错误:

Method save does not exist. 

这是我的代码:

$posts_to_purge = Post::where('post_date', '<', \Carbon\Carbon::now()->subDays(7)->toDateString())->get();

if(count($posts_to_purge) > 0)
{
    foreach ($posts_to_purge as $post) {
        $directory = storage_path() . '/' . $post->post_date;

        $deleted_folder = File::deleteDirectory($directory);

        if($deleted_folder)
        {
            // 'purged' is a column in my Post table
            $post->purged = 1;
        }
        else 
        {
            Log::error('Unable to delete \''.$directory.'\' directory');
        }

    } // end foreach loop

    // Update collection with purged posts
    $posts_to_purge->save();

}

这方面的一个问题......这是最有效的方法吗?因为我只想更新集合中的某些记录..我应该创建一个单独的集合并仅保存它吗?

1 个答案:

答案 0 :(得分:1)

收藏集实际上没有权力与Laravel中的数据库进行交互。您可以使用save()方法定义自定义集合类,但是有一种简单的方法可以执行您想要的操作。

$posts_to_purge = Post::where('post_date', '<', \Carbon\Carbon::now()->subDays(7)->toDateString())->get();

if(count($posts_to_purge) > 0)
{
    foreach ($posts_to_purge as $post) {
    $directory = storage_path() . '/' . $post->post_date;

    $deleted_folder = File::deleteDirectory($directory);

    if($deleted_folder)
    {
        // 'purged' is a column in my Post table
        $post->purged = 1;
        $post->save ();
    }
    else 
    {
        Log::error('Unable to delete \''.$directory.'\' directory');
    }

} // end foreach loop

// Update collection with purged posts
$posts_to_purge->save();

}

是的,每个更新的模型都会执行一次查询,但主键更新速度非常快。

如果您非常致力于使用一个查询,则只需将每个更新的Post的ID保存到数组中,然后执行Post::whereIn ('id', $updated_ids)->update(['purged' => 1]);

之类的操作。