急切加载区分大小写吗?

时间:2020-07-31 16:14:54

标签: php laravel

考虑到文档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 个答案:

答案 0 :(得分:0)

从一些快速测试来看,虽然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实际上会产生不同的结果,即使它们看起来很相似。使用与您在访问时使用的加载方式相同的情况,这样会很好。请注意,由于关系是函数,因此对PHP函数使用正确的大小写(studlyCaps,也称为pascalCase)应该是您的首选方法。