如何防止 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,并且 camelCasedsnake_cased 调用都将转发到 camelCased() 方法。

就是说,如果您将关系定义为 opening_times(),它永远不会起作用。