使用预加载进行多重查询 (N+1) - Laravel

问题描述 投票:0回答:1

我正在尝试加载对话中的所有联系人,除非我尝试访问对话属性,否则它会正常工作。

$contatos = Contato::whereBelongsTo($conta)->with('Conversa')->get();

foreach ($contatos as $contato) {
    $saida_contato = new \stdClass();
    $saida_contato->nome_contato = $contato->nome;
    $saida_contato->id = $contato->id;
    $saida_contato->numero_contato = $contato->id_contato;
    $saida_contato->conta_id = $contato->conta_id;

上面的代码执行两个查询:

当我尝试访问“conversa”的属性时,它执行 90 个查询。

 $saida_contato->conversa_aberta = $contato->conversa->first()->id;

我可以使用以下方式访问我想要的值: contato->conversa[0]->aberta,但是当我这样做时,它会生成很多查询。

如果我之前已经预先加载过它,为什么它要为每个联系人执行查询?

php laravel
1个回答
0
投票

您可以对急切加载返回的集合使用

first()
方法,而不是重新访问关系。

$contatos = Contato::whereBelongsTo($conta)->with('Conversa')->get();

foreach ($contatos as $contato) {
    $saida_contato = new \stdClass();
    $saida_contato->nome_contato = $contato->nome;
    $saida_contato->id = $contato->id;
    $saida_contato->numero_contato = $contato->id_contato;
    $saida_contato->conta_id = $contato->conta_id;
    $saida_contato->conversa_aberta = $contato->Conversa->first()->id;
}

您不会通过在此集合上调用

first()
来触发其他查询。

© www.soinside.com 2019 - 2024. All rights reserved.