我正在尝试在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);
,但它没有相应的工作。有人可以建议我如何在这种情况下执行。
谢谢。
with()
适用于您最初购买模型的时间。如果您已经拥有模型,则可以改为使用load()
。这叫做lazy eager loading。
public function show(Standard $standard)
{
$standard->load('stream');
return response()->json(['data' => $standard], 200);
}
你有几个选择:
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。
请试试这段代码。 laravel docs提供更详细的解释
$standard->load('stream');
return response()->json(['data' => $standard], 200);