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

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

在搜索功能中從模型訪問表列時出現問題

在搜索功能中從模型訪問表列時出現問題

PHP
絕地無雙 2023-07-07 10:38:47
我有一個搜索功能,可以根據用戶輸入的過濾器(從/到年齡、從/到身高)搜索用戶。問題是年齡列位于用戶表(用戶模型)中,身高列位于用戶配置文件表(用戶配置文件模型)中。我可以輕松地從每個模型中單獨獲取結果,但我想在結合這兩個條件時獲取結果。例如,獲取年齡在 30 歲到 40 歲、身高在 180 厘米到 190 厘米之間的用戶。任何幫助表示贊賞。這是我的代碼。搜索控制器.phpclass SearchController extends Controller{    public function search(Request $request, User $user)    {        $query = User::query();   // HERE I NEED TO FETCH USER PROFILE COLUMNS FROM MODEL ALONG WITH USER        dd($query);        // HEIGHT SETTING        if ($request->has('from_cm')) {            $request->get('from_cm');        }        if ($request->has('to_cm')) {            $request->get('to_cm');        }        if ($request->from_cm && $request->to_cm) {            $query->whereBetween('height', [$request->from_cm, $request->to_cm]);        } elseif ($request->from_cm) {            $query->where('height', '>=', $request->from_cm);        } elseif ($request->to_cm) {            $query->where('height', '<=', $request->to_cm);        }        // AGE SETTING        if ($request->has('from_age')) {            $request->get('from_age');        }        if ($request->has('to_age')) {            $request->get('to_age');        }        if ($request->from_age && $request->to_age) {            $query->whereBetween('age', [$request->from_age, $request->to_age]);        } elseif ($request->from_age) {            $query->where('age', '>=', $request->from_age);        } elseif ($request->to_age) {            $query->where('age', '<=', $request->to_age);        }        $results = $query->get();        //dd($results);    }}用戶.phpprotected $fillable = [        'username',         'email',         'first_name',        'last_name',        'age',    ];  public function userProfile(){    return $this->hasOne(UserProfile::class);}用戶配置文件.phpprotected $fillable = [        'user_id',        'interested_in',        'height',          ];    public function user()    {        return $this->belongsTo(User::class);    }因此,需要明確的是,我不需要特定用戶及其用戶配置文件,而是將用戶和用戶配置文件模型中的列連接到一個變量($query)中。
查看完整描述

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 的優雅語法。


查看完整回答
反對 回復 2023-07-07
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

我會做以下事情:

  1. 從控制器中提取此邏輯并將其放入用戶模型中。

  2. 由于您在控制器中對用戶模型使用依賴注入,因此您可以在控制器中執行類似的操作

$user->filter($request->input('min_height'),$request->input('max_height'),$request->input('min_age'),$request->input('max_age'));

這樣,控制器將負責將所需的數據傳遞給模型,然后您可以在模型內部進行查詢。

這樣做的好處是

  1. 更清晰的控制器

  2. 控制器將只負責接收請求、傳遞所需的數據并將結果傳遞給索引。

  3. 只要您擁有用戶實例,您就可以在任何地方重復使用此過濾器

  4. 責任將在模型和控制器之間分配,控制器不會做所有事情

在您的用戶模型中,查詢將如下所示:

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;

}

  1. 我們返回 eloquent 實例而沒有這樣做的原因 $query->get()是,通過這種方式,我們可以在控制器中執行此操作,并且對于重用此代碼的每個地方,我們可以根據需要執行諸如orderBy、groupByfirst和其他操作之類的操作get我們調用它的地方。因為如果你做了一個,$query->get()你就會受到唯一的限制Collection

  2. 之后,我們可以在控制器中執行類似的操作$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 語句來根據需要過濾它們來滿足您的需求。


查看完整回答
反對 回復 2023-07-07
  • 2 回答
  • 0 關注
  • 150 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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