2 回答

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
據(jù)我所知,您需要一個(gè)類似于以下內(nèi)容的查詢:
$users = User::with('userProfile')
->whereBetween('age', [$minAge, $maxAge])
->whereHas('userProfile', function($query){
$query->whereBetween('height', [$minHeight, $maxHeight]);
});
這將獲取所有用戶的個(gè)人資料,其中用戶的年齡介于$minAge和 之間$maxAge,個(gè)人資料的身高介于$minHeight和之間$maxHeight。
編輯
如果您希望能夠使用文件管理器單獨(dú)檢索數(shù)據(jù),那么您需要的是條件子句。代碼看起來像這樣:
$users = User::with('userProfile')
->when($ageFilterActive, function($query, $ageFilterActive) {
$query->whereBetween('age', [$minAge, $maxAge]);
})->when($heightFilterActive, function($query, $heightFilterActive) {
$query->whereHas('userProfile', function($query){
$query->whereBetween('height', [$minHeight, $maxHeight]);
});
});
我希望我沒有搞亂語法,但你明白了。if-else或者,您可以通過擴(kuò)展變量的語句來實(shí)現(xiàn)相同的目的$query,但我個(gè)人更喜歡whenLaravel 的優(yōu)雅語法。

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
我會做以下事情:
從控制器中提取此邏輯并將其放入用戶模型中。
由于您在控制器中對用戶模型使用依賴注入,因此您可以在控制器中執(zhí)行類似的操作
$user->filter($request->input('min_height'),$request->input('max_height'),$request->input('min_age'),$request->input('max_age'));
這樣,控制器將負(fù)責(zé)將所需的數(shù)據(jù)傳遞給模型,然后您可以在模型內(nèi)部進(jìn)行查詢。
這樣做的好處是
更清晰的控制器
控制器將只負(fù)責(zé)接收請求、傳遞所需的數(shù)據(jù)并將結(jié)果傳遞給索引。
只要您擁有用戶實(shí)例,您就可以在任何地方重復(fù)使用此過濾器
責(zé)任將在模型和控制器之間分配,控制器不會做所有事情
在您的用戶模型中,查詢將如下所示:
public function scopeWithUserProfile($query)
{
// Left join or inner join depends on your needs
return $query->join('user_profile', 'users.id', '=', 'user_profile.user_id');
}
public function filter($minHeight, $maxHeight, $minAge, $maxAge) {
$query = $this->query()
->withUserProfile();
if (!is_null($minHeight) && !is_null($maxHeight)) {
$query->whereBetween('height', [$minHeight, $maxHeight]);
}
if (!is_null($minAge) && !is_null($maxAge)) {
$query->whereBetween('age', [$minAge, $maxAge]);
}
return $query;
}
我們返回 eloquent 實(shí)例而沒有這樣做的原因
$query->get()
是,通過這種方式,我們可以在控制器中執(zhí)行此操作,并且對于重用此代碼的每個(gè)地方,我們可以根據(jù)需要執(zhí)行諸如orderBy
、groupBy
、first
和其他操作之類的操作get
我們調(diào)用它的地方。因?yàn)槿绻阕隽艘粋€(gè),$query->get()
你就會受到唯一的限制Collection
。之后,我們可以在控制器中執(zhí)行類似的操作
$query->get()
,然后從那里我們將收集所需的數(shù)據(jù)。
在最后的控制器中你必須有這樣的東西
public function search(Request $request, User $user)
{
$user->filter($request->input('min_height'),$request->input('max_height'),$request->input('min_age'),$request->input('max_age'));
return view('your.view.here', [
'userData' => $user->get(),
]);
}
我不知道解釋是否足夠清楚,但只要我能,我將非常樂意回答您的任何問題:P
我希望語法沒問題,但您可以通過添加更多 If 和 else 語句來根據(jù)需要過濾它們來滿足您的需求。
- 2 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報(bào)