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


How to include an Eloquent relationship into JSON conversion result?

我想用Laravel 5将JSON数据返回到我的Angular前端,但我遇到了这个问题:我有一个Alert雄辩的模型,它与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;

这是非常丑陋的。。。

您需要手动加载关系。这被称为懒惰渴望加载关系。

$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');
}

编码快乐!