是否可以急切加载key =>数组?使用eloquent的()或load()函数而不是Model对象的集合?我只需要关系中的几个值,并且不需要任何对象功能,所以我真的不需要内存开销
"relations" => [
"relationship" => Collection()
"items" => [
0 => Model()
"attributes" => ...
"table" => ...
"guarded" => ...
...etc
1 => Model(),
...etc
如果我可以拥有更像
的东西"relations" => [
"relationship" => [
"items" => [
0 => [key => val, key => val ...],
1 => [key => val, key => val ...],
...etc
这可能吗?或者甚至使用一个基本的php对象而不是一个Eloquent Model,其中包含一些疯狂的开销,只需要几个值?我查看了API,并在构建查询构建器对象时逐步调试了一个调用堆栈,我没有看到任何明显的方法,但我很好奇是否有人知道解决方法。< / p>
谢谢!
-Eric
答案 0 :(得分:0)
关于急切装载的一点让我失望。这意味着你想加载嵌套在一堆模型中的一堆模型,即:
// Returns 1000 Foo's with all their bars in two queries.
Foo::take(1000)->with('bars')->get();
考虑到你的问题达到内存限制,我怀疑你真的想以这种方式调用急切加载。
直接访问查询构建器
我认为您正在寻找一种方法来查询关系,而无需保湿模型。您可以通过直接访问查询构建器来完成此操作。
$foo = Foo::find($id);
// Returns hydrated models
$bars = $foo->bars()->take(1000)->get();
// Returns raw data
$bars = $foo->bars()->take(1000)->getQuery()->get();
默认急切加载
可以直接在模型上设置急切加载,从而导致某些关系始终加载模型。
// Class Bar
protected $with = ['awks'];
如果是这种情况,1000 Bars会自动加载所有的Awks。在你的情况下会使事情呈指数级恶化。这是一个快乐的媒介,允许您避免急切加载嵌套关系,同时仍然享受模型的好处。
// Returns hydrated models without eager loading any relationships
$bars = Foo::find($id)->bars()->take(1000)->getModels();
答案 1 :(得分:0)
最终,我想出了一个与我想要的不同的解决方案。由于我只是真正需要加载关系的数据的总和,我发现聚合可以被急切加载。
我的问题的一般要点是:我们有客户。他们有客户(债务人)。这些债务人的余额是许多不同模型(付款,发票,信用票据以及其他一些模型)的总和。我希望能够调用debtor-&gt; balance,这将是所有这些事情的总和。这很容易对查询进行硬编码以实现此函数的平衡,但是在执行时会遇到n + 1问题
$customer = Customer::find(###)
foreach($customer->debtors as $debtor)
{
$debtor->balance();
}
提出这个问题的原始解决方案是让balance函数迭代组成余额的所有组件,并将它们全部添加。因此,通过急切加载所有这些组件,我可以通过急切加载来进行$ debtor-&gt; balance()或$ customer-&gt; debtor-&gt; balance(),一切似乎都很好。您可以看到如果客户有2000个债务人,并且债务人可能有几十张发票,每个都有一个或多个付款,这就变成了要加载的大量数据。通过重组急切负载只加载一个聚合值,每个债务人只需加载5个关系,每个关系中都有一个项目,使其在内存限制范围内。