如何将Eloquent关系包含到JSON转换结果中?

时间:2016-07-22 03:16:58

标签: php json laravel eloquent

我想用Laravel 5将JSON数据返回到我的Angular前端,但我遇到了这个问题:我有一个警告雄辩的模型与 AlertFrequency有关系型号:

class Alert extends Model
{
    public function alertFrequency()
    {
        return $this->belongsTo('App\Models\AlertFrequency');
    }
}

但是当我尝试将警报列表作为JSON返回时...

$alerts = Auth::user()->alerts->toJson();

return $alerts;

这是我得到的:

[{"id":9,"title":"fqdsgsq","place":"gdqsgq","user_id":1,"alert_frequency_id":3,"job_naming_id":3,"created_at":"2016-07-16 14:09:41","updated_at":"2016-07-16 14:09:41"}]  

所以我确实有" alert_frequency_id"列值但不是实际的 AlertFrequency 对象

我发现到目前为止唯一的解决方法是:

$alerts = Auth::user()->alerts;

foreach ($alerts as $alert) {
    $alert->jobNaming = $alert->jobNaming;
    $alert->alertFrequency = $alert->alertFrequency;
}

return $alerts;

非常难看......

1 个答案:

答案 0 :(得分:2)

您需要手动加载关系。这被称为lazy eager loading关系。

$alerts = Auth::user()->alerts->load('alertFrequency')->toJson();
return $alerts;

执行Auth::user()->alerts->toJson()时,您刚刚从Alert模型中获取数据,但是您需要来自其他模型(另一个表)的数据,那么您需要使用load方法来判断数据。

加成

如果您的代码在控制器方法或路由器关闭中而不是调用toJson(),您只需返回集合,Laravel将为您执行此操作。例如:

public function controllerMethod() {
    return Auth::user()->alerts->load('alertFrequency');
}

快乐的编码!