在laravel中的控制器中注入模型并返回值'with'关系

问题描述 投票:0回答:3

我正在尝试在Laravel上构建应用程序,我想知道我们是否可以在控制器函数中注入模型时使用with关系,例如:

我有一个名为Stream的模型,我有一个名为Standard的模型。 Standard属于Stream所以我的代码如下:

class Standard extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = [];

    public function stream()
    {
        return $this->belongsTo('Models\Stream', 'stream_id', 'id');
    }
}

现在在我的StandardController中,我有以下功能来显示模型:

public function show(Standard $standard)
{
    return response()->json(['data' => $standard], 200);
}

我正在尝试使用return response()->json(['data' => $standard->with('stream')], 200);,但它没有相应的工作。有人可以建议我如何在这种情况下执行。

谢谢。

laravel laravel-5 laravel-5.7
3个回答
3
投票

with()适用于您最初购买模型的时间。如果您已经拥有模型,则可以改为使用load()。这叫做lazy eager loading

public function show(Standard $standard)
{
    $standard->load('stream');

    return response()->json(['data' => $standard], 200);
} 

1
投票

你有几个选择:

1)你可以使用API Resources。这是我的首选方法。

2)如果API资源不是你的一杯茶,你只需要以某种方式加载关系。一种方法是$standard->load('stream')。另一种方法是访问关系:$standard->stream

这里发生的是任何访问的关系使它成为模型的relations密钥,这使得默认的json序列化有点不可预测。因此,我更喜欢明确API资源。

3)您可以修改Standard模型的$with数组以包含stream,但我不是这种方法的粉丝,因为这意味着每次获取Standard记录时,它们将自动获取stream关系。

with()是一个你在Eloquent Builder对象上调用的方法,它将获取Eager Loading的关系。在这种情况下,您正在使用Model实例,而不是Eloquent Builder。


1
投票

请试试这段代码。 laravel docs提供更详细的解释

$standard->load('stream');
return response()->json(['data' => $standard], 200);
© www.soinside.com 2019 - 2024. All rights reserved.