为了账号安全,请及时绑定邮箱和手机立即绑定

预加载是否区分大小写?

预加载是否区分大小写?

PHP
达令说 2023-09-08 17:09:43
考虑到文档https://laravel.com/docs/5.0/eloquent#eager-loading让我们有以下示例:$clients = Clients::with('Addresses')->get();我们现在可以addresses像这样循环:foreach ($clients->Addresses ..)  foreach ($clients->addresses ..)如果我们使用第一种方法(区分大小写),这是否意味着预加载结果将被忽略,并且是否会执行另一个查询?如你所知,如果我们这样做:$clients = Clients::get();我们仍然可以循环访问地址,但将进行另一个查询。foreach ($clients->Addresses ..)
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

从一些快速测试来看,虽然 Eager Loaded 实际上不区分大小写,但只有在加载和访问时使用相同大小写时才会如此。对于你的例子:


$clients = Client::with(['addresses' => function ($q) {

  $q->limit(2);

}])->get();


// Good

foreach ($clients as $client){

  foreach ($client->addresses as $address) {

    // Should loop twice and output 2 Addresses

  }

}


// Bad

foreach ($clients as $client){

  foreach ($client->Addresses as $address) {

    // Will loop X times for each associated `address`

  }

}

使用DB::enableQueryLog()DB::getQueryLog()可以帮助调试。如果您急于加载,您应该看到一行:

"query" => "select * from `addresses` where `addresses`.`client_id` in (...) limit 1

如果在迭代时运行附加查询,您将看到每个客户端的查询:

"query" => "select * from `addresses` where `addresses`.`client_id` = ? and `addresses`.`client_id` is not null",

还有许多其他方法可以对此进行测试,但总而言之,访问$client->addresses$client->Addresses实际上会产生不同的结果,即使它们看起来相似。使用与访问时使用的相同的案例来加载,就可以了。studlyCaps请注意,由于关系是函数,因此对 PHP 函数(又名)使用正确的大小写pascalCase应该是您的首选方法。


查看完整回答
反对 回复 2023-09-08
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信