亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

預加載是否區分大小寫?

預加載是否區分大小寫?

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條經驗 獲得超13個贊

從一些快速測試來看,雖然 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 關注
  • 117 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號