【问题标题】:Laravel eager loading issue with findOrFail()Laravel 的 findOrFail() 急切加载问题
【发布时间】:2020-09-24 20:01:38
【问题描述】:

为什么我会为此获得多个结果?我只想要给定客户 ID 的“联系人”。并非适用于所有客户。

public function edit($id)
{
    $client = Client::findOrFail($id)->with('contacts')->get();
}

谢谢,

【问题讨论】:

    标签: php laravel laravel-5.2


    【解决方案1】:

    基本上,findOrFail() 会为您找到一个结果,而不是返回一个集合。这意味着它已经为您拨打了get() 电话。所以你不能在那之后添加另一个get()。如果你这样做了,你会得到你注意到的奇怪的结果,因为你实际上是在构建一个新的查询。

    这也意味着您不需要急切地加载任何内容。急切加载之所以好的原因是因为它允许您在单个查询中获取多个对象的数据。但无论如何,这里只有一个对象 - 所以这并不重要。

    当您需要联系人时,您可以轻松地只使用$client = Client::findOrFail($id);,然后再使用$client->contacts。它不会让你的表现更差。

    如果您只想要联系人而不是客户,您可以轻松地做到这一点:$client = Client::findOrFail($id)->contacts;

    【讨论】:

    • 非常正确,我刚刚问过同样的问题,findorfail 会在不使用 ->with 的情况下进行快速加载(至少在我的情况下)无论如何我认为它也可以像这样工作 Client::with ('联系人')->findOrFail($id);
    • 谢谢,我如何访问blade.view 中的“联系人”? {{ Form::model($client, … {!! Form::text('contact->name', null, array('class' => 'form-control')) !!}
    • 如果您有多个联系人,只需发送@foreach ($client->contacts as $contact) 并从那里开始。
    • 我只有一个联系人。但它每年都在变化。
    【解决方案2】:

    虽然 Joel Hinz 的响应是正确的,但您仍然可以在此查询中进行预加载。

    只要做:

    $client = Client::with('contacts')->findOrFail($id);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 2020-02-26
      • 2014-08-13
      • 2021-04-23
      • 2018-10-15
      • 1970-01-01
      相关资源
      最近更新 更多