这是我的查询:
$profile = \App\ShippingProfile::findOrFail(2)
::with('costs')
->with( ['methods.zone' => function($query) {
$query->where('id', 2);
}])->get();
因此,我需要ID为2的运输配置文件ID 2(具有相关的“成本”模型)和ID为2的运输相关配置文件“方法”,以及方法的相关“区域”。
但是我不知道如何得到结果。如果我尝试->get()
,则会得到全部运送配置文件,如果尝试
->first()
我得到个人资料ID 1 。
那么我将如何检索结果?我只看过“ get”,“ first”和“ find” ...还是查询有问题?
答案 0 :(得分:2)
您当前的代码存在一些问题。首先,您遇到语法错误:
$profile = \App\ShippingProfile::findOrFail(2)
::with('costs')
第二个::
应该是->
。
第二,当您执行firstOrFail()
时,实际上是在执行查询并返回Model
作为结果。因此,当您将其余部分链接到Model
实例上时,很可能最终会出错。
但是,有两种方法可以实现目标。首先,尝试使用whereKey
,它会针对主键在查询中添加where子句(就像使用findOrFail
一样-但它不会立即执行查询并返回模型),使用first()
来获取预先加载了关系的模型实例:
$profile = \App\ShippingProfile::whereKey(2)
->with(['costs', 'method.zone' => function ($query) {
$query->where('id', 2);
}])
->first();
或者,如果您已经有模型的实例,则可以使用load(...)
,就像使用with(...)
来加载关系一样:
$profile = App\ShippingProfile::findOrFail(2);
$profile->load(['costs', 'method.zone' => function ($query) {
$query->where('id', 2);
}]);