2 回答

TA貢獻1998條經驗 獲得超6個贊
據我所知,您需要一個類似于以下內容的查詢:
$users = User::with('userProfile')
->whereBetween('age', [$minAge, $maxAge])
->whereHas('userProfile', function($query){
$query->whereBetween('height', [$minHeight, $maxHeight]);
});
這將獲取所有用戶的個人資料,其中用戶的年齡介于$minAge和 之間$maxAge,個人資料的身高介于$minHeight和之間$maxHeight。
編輯
如果您希望能夠使用文件管理器單獨檢索數據,那么您需要的是條件子句。代碼看起來像這樣:
$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或者,您可以通過擴展變量的語句來實現相同的目的$query,但我個人更喜歡whenLaravel 的優雅語法。

TA貢獻1725條經驗 獲得超8個贊
我會做以下事情:
從控制器中提取此邏輯并將其放入用戶模型中。
由于您在控制器中對用戶模型使用依賴注入,因此您可以在控制器中執行類似的操作
$user->filter($request->input('min_height'),$request->input('max_height'),$request->input('min_age'),$request->input('max_age'));
這樣,控制器將負責將所需的數據傳遞給模型,然后您可以在模型內部進行查詢。
這樣做的好處是
更清晰的控制器
控制器將只負責接收請求、傳遞所需的數據并將結果傳遞給索引。
只要您擁有用戶實例,您就可以在任何地方重復使用此過濾器
責任將在模型和控制器之間分配,控制器不會做所有事情
在您的用戶模型中,查詢將如下所示:
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 實例而沒有這樣做的原因
$query->get()
是,通過這種方式,我們可以在控制器中執行此操作,并且對于重用此代碼的每個地方,我們可以根據需要執行諸如orderBy
、groupBy
、first
和其他操作之類的操作get
我們調用它的地方。因為如果你做了一個,$query->get()
你就會受到唯一的限制Collection
。之后,我們可以在控制器中執行類似的操作
$query->get()
,然后從那里我們將收集所需的數據。
在最后的控制器中你必須有這樣的東西
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 語句來根據需要過濾它們來滿足您的需求。
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報