如何防止 Laravel 在查询受限集后加载对象 属性 访问的完整数据集
How to prevent Laravel from loading full set of data on object property access after already querying a restricted set
嗨,Laravel 黑客们,
我遇到了受限 Eloquent 查询的问题。我尝试将查询的数据限制在最低限度,因此使用了急切的加载约束。然而,问题是在我查询数据后,每次访问我的模型 (opening_times) 的 属性 都会导致所有关联选项的 return 并丢失约束。 属性 在我的模型中由 hasMany 关系支持。看看下面的代码:
$store = BRModels\Store::with(
[ 'coordinates',
'openingTimes',
'user'
])
->with(
[
'openingTimeExceptions' => function($query) { $query->where('day', '=', date('Y-m-d'));},
'openingTimes' => function($query) { $query->where('day', '=', date('N')); }
])
->find($id);
die(json_encode($store));
给出包含以下内容的输出:
{
...,
"opening_times": [
{
"id": "3",
"store_id": "1",
"day": "3",
"open": "05:00:00",
"close": "13:00:00",
"open_additional": "16:30:00",
"close_additional": "23:30:00"
}
],
...
}
做我想做的事。但是,当我将最后一行更改为以下内容时:
die(json_encode($store->opening_times));
我的精彩限制不见了,如你所见
[
{
"id": "1",
"store_id": "1",
"day": "1",
"open": "05:00:00",
"close": "13:30:00",
"open_additional": "16:30:00",
"close_additional": "21:00:00"
},
...,
{
"id": "7",
"store_id": "1",
"day": "7",
"open": "07:00:00",
"close": "23:00:00",
"open_additional": null,
"close_additional": null
}
]
如您(希望)所见,我得到了与原始项目相关的所有条目,而不仅仅是我在执行受限查询时得到的条目。看不出来就怪我解释不好,给个好评
我的问题:如何避免访问已查询的对象 属性 return 在没有以前的限制的情况下访问新查询的数据集?
如果有人能帮助我,我会很高兴!
提前致谢!
遵守一个约定:
with('openingTimes')
// then
die(json_encode($store->openingTimes));
你会好起来的。
注意关系被保存为数组键:
$store->openingTimes; // setRelation('openingTimes', $value)
$store->opening_times; // setRelation('opening_times', $value)
然后:
$store->getRelations();
// array(
// 'openingTimes' => ... ,
// 'opening_times' => ...
// );
发生这种情况是因为 Eloquent 将关系调用为 dynamic properties
,并且 camelCased
和 snake_cased
调用都将转发到 camelCased()
方法。
就是说,如果您将关系定义为 opening_times()
,它永远不会起作用。
嗨,Laravel 黑客们,
我遇到了受限 Eloquent 查询的问题。我尝试将查询的数据限制在最低限度,因此使用了急切的加载约束。然而,问题是在我查询数据后,每次访问我的模型 (opening_times) 的 属性 都会导致所有关联选项的 return 并丢失约束。 属性 在我的模型中由 hasMany 关系支持。看看下面的代码:
$store = BRModels\Store::with(
[ 'coordinates',
'openingTimes',
'user'
])
->with(
[
'openingTimeExceptions' => function($query) { $query->where('day', '=', date('Y-m-d'));},
'openingTimes' => function($query) { $query->where('day', '=', date('N')); }
])
->find($id);
die(json_encode($store));
给出包含以下内容的输出:
{
...,
"opening_times": [
{
"id": "3",
"store_id": "1",
"day": "3",
"open": "05:00:00",
"close": "13:00:00",
"open_additional": "16:30:00",
"close_additional": "23:30:00"
}
],
...
}
做我想做的事。但是,当我将最后一行更改为以下内容时:
die(json_encode($store->opening_times));
我的精彩限制不见了,如你所见
[
{
"id": "1",
"store_id": "1",
"day": "1",
"open": "05:00:00",
"close": "13:30:00",
"open_additional": "16:30:00",
"close_additional": "21:00:00"
},
...,
{
"id": "7",
"store_id": "1",
"day": "7",
"open": "07:00:00",
"close": "23:00:00",
"open_additional": null,
"close_additional": null
}
]
如您(希望)所见,我得到了与原始项目相关的所有条目,而不仅仅是我在执行受限查询时得到的条目。看不出来就怪我解释不好,给个好评
我的问题:如何避免访问已查询的对象 属性 return 在没有以前的限制的情况下访问新查询的数据集?
如果有人能帮助我,我会很高兴!
提前致谢!
遵守一个约定:
with('openingTimes')
// then
die(json_encode($store->openingTimes));
你会好起来的。
注意关系被保存为数组键:
$store->openingTimes; // setRelation('openingTimes', $value)
$store->opening_times; // setRelation('opening_times', $value)
然后:
$store->getRelations();
// array(
// 'openingTimes' => ... ,
// 'opening_times' => ...
// );
发生这种情况是因为 Eloquent 将关系调用为 dynamic properties
,并且 camelCased
和 snake_cased
调用都将转发到 camelCased()
方法。
就是说,如果您将关系定义为 opening_times()
,它永远不会起作用。