為什么下面的代碼回傳錯誤的結果?
$player->wins = Game::where('home_player_1', '=', $player->id)
->orWhere('home_player_2', '=', $player->id)
->orWhere('home_player_3', '=', $player->id)
->orWhere('home_player_4', '=', $player->id)
->where('result', '=','1') // 1 = win
->get();
$player->losses = Game::where('home_player_1', '=', $player->id)
->orWhere('home_player_2', '=', $player->id)
->orWhere('home_player_3', '=', $player->id)
->orWhere('home_player_4', '=', $player->id)
->where('result', '=','0') // 0 = lose
->get();
$player->matches = Game::where('home_player_1', '=', $player->id)
->orWhere('home_player_2', '=', $player->id)
->orWhere('home_player_3', '=', $player->id)
->orWhere('home_player_4', '=', $player->id)
->get();
我得到的是 5 場比賽 / 5 場勝利 / 5 場失敗,而實際上是 5/5/0。我該怎么做?
uj5u.com熱心網友回復:
將您的home_player_x子句移動到嵌套的where 條件子句中:
$player->wins = Game::where(function ($query) use ($player) {
return $query->where('home_player_1', $player->id)
->orWhere('home_player_2', $player->id)
->orWhere('home_player_3', $player->id)
->orWhere('home_player_4', $player->id);
})->where('result', 1)
->get();
...
這樣,它就不會與最后一個->where('result')子句沖突。
此外,由于您多次重用此子句,請將其定義為變數,然后重用它:
$conditional = function ($query) use ($player) {
return $query->where(function ($subQuery) use ($player) {
return $subQuery->orWhere('home_player_1', $player->id)
->orWhere('home_player_2', $player->id)
->orWhere('home_player_3', $player->id)
->orWhere('home_player_4', $player->id);
})
});
$player->wins = Game::where($conditional)->where('result', 1)->get();
$player->losses = Game::where($conditional)->where('result', 0)->get();
$player->matches = Game::where($conditional)->get();
或者,考慮將其定義為Game模型上的 Scope ,以便您可以呼叫Game::playerMatches($player)->where('result', 1)->get()等。請參閱檔案:
https://laravel.com/docs/8.x/eloquent#local-scopes
我不會真正觸及太多了這一點,但定義編號列,比如home_player_1,home_player_2等通常被認為是不好的資料的做法。您應該定義一個home_players表,或者games_players,與type列home或away表和相關的Game和Players的方式。
uj5u.com熱心網友回復:
查看Laravel 檔案中關于邏輯分組的帖子。我認為基于此,您的宣告matches應該是:
$player->matches = Game::where(function ($query) use ($player) {
$query->where('home_player_1', '=', $player->id)
->orWhere('home_player_2', '=', $player->id)
->orWhere('home_player_3', '=', $player->id)
->orWhere('home_player_4', '=', $player->id);
})->get();
我不確定這是否有幫助,因為我沒有其余的代碼,但請測驗它并讓我知道。
也來自檔案:
"In fact, you should generally always group calls to the orWhere method in parentheses in order to avoid unexpected query behavior."
uj5u.com熱心網友回復:
需要修改 orWhere() 條件,而不是上面你可以使用下面的 where 子句:
$player->wins = Game::where('result', '=','1') // 1 = win
->where(function ($query) use ($player) {
$query->where('home_player_1', '=', $player->id)
->orWhere('home_player_2', '=', $player->id)
->orWhere('home_player_3', '=', $player->id)
->orWhere('home_player_4', '=', $player->id);
})->get();
$player->losses = Game::where('result', '=', '0') // 0 = lose
->where(function ($query) use ($player) {
$query->where('home_player_1', '=', $player->id)
->orWhere('home_player_2', '=', $player->id)
->orWhere('home_player_3', '=', $player->id)
->orWhere('home_player_4', '=', $player->id);
})->get();
$player->matches = Game::
where(function ($query) use ($player) {
$query->where('home_player_1', '=', $player->id)
->orWhere('home_player_2', '=', $player->id)
->orWhere('home_player_3', '=', $player->id)
->orWhere('home_player_4', '=', $player->id);
})->get();
當有多個 orWhere() 時,正常條件不起作用,需要在單個 where 下添加它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380512.html
