You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中with闭包内使用each添加临时属性不持久化问题

问题原因

你在with的关联查询闭包里调用each是错误的逻辑——with的闭包作用是构建关联查询的SQL语句,此时调用each会提前执行查询并临时处理一批模型对象,但这些处理后的模型并不会被Laravel保留到最终加载的Project关联集合中。最终加载到Project里的tasks是重新查询生成的新模型,所以你添加的临时属性自然丢失了。

解决办法

方案一:关联加载完成后遍历集合处理

拿到查询结果后,再遍历每个Project的tasks集合添加临时属性,这是最直接的临时属性处理方式:

$projects = Project::with(['tasks' => function($query) {
        $query->whereBetween('start_date', ['2024-04-21', '2024-04-28'])
              ->orWhereBetween('end_date', ['2024-04-21', '2024-04-28']);
    }])
    ->status(['Active', 'Scheduled'])
    ->sortByDesc('last_status.start_date');

// 加载完成后统一处理tasks集合
$projects->each(function($project) {
    $project->tasks->each(function($task) {
        $task->test = 'test';
        $task->date = $task->end_date;
        
        // 若需要临时属性在转数组/JSON时显示,需添加到可见属性列表
        $task->setVisible(array_merge($task->getVisible(), ['test', 'date']));
    });
});

// 此时再查看就能看到属性
dd($projects->first()->tasks->first());

方案二:用模型访问器(适合全局复用的属性)

如果date这类属性是业务中经常需要的,可以在Task模型里定义访问器,并自动追加到模型属性中:

// app/Models/Task.php
class Task extends Model
{
    // 自动追加到模型的属性列表
    protected $appends = ['date', 'test'];

    // 定义date属性的访问器
    public function getDateAttribute()
    {
        return $this->end_date;
    }

    // 定义test属性的访问器(如果需要固定值或动态计算)
    public function getTestAttribute()
    {
        return 'test';
    }
}

这种方式下,只要加载Task模型,这些属性会自动存在,无需手动遍历处理。

方案三:用map转换集合结果

也可以通过map方法直接转换关联集合,一次性完成结果处理:

$projects = Project::with(['tasks' => function($query) {
        $query->whereBetween('start_date', ['2024-04-21', '2024-04-28'])
              ->orWhereBetween('end_date', ['2024-04-21', '2024-04-28']);
    }])
    ->status(['Active', 'Scheduled'])
    ->sortByDesc('last_status.start_date')
    ->map(function($project) {
        // 转换tasks集合并添加属性
        $project->tasks = $project->tasks->map(function($task) {
            $task->test = 'test';
            $task->date = $task->end_date;
            return $task;
        });
        return $project;
    });

内容的提问来源于stack exchange,提问作者dfeva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:22:16