第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在搜索功能中從模型訪問表列時(shí)出現(xiàn)問題

在搜索功能中從模型訪問表列時(shí)出現(xiàn)問題

PHP
絕地?zé)o雙 2023-07-07 10:38:47
我有一個(gè)搜索功能,可以根據(jù)用戶輸入的過濾器(從/到年齡、從/到身高)搜索用戶。問題是年齡列位于用戶表(用戶模型)中,身高列位于用戶配置文件表(用戶配置文件模型)中。我可以輕松地從每個(gè)模型中單獨(dú)獲取結(jié)果,但我想在結(jié)合這兩個(gè)條件時(shí)獲取結(jié)果。例如,獲取年齡在 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);    }因此,需要明確的是,我不需要特定用戶及其用戶配置文件,而是將用戶和用戶配置文件模型中的列連接到一個(gè)變量($query)中。
查看完整描述

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


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

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊

我會做以下事情:

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

  2. 由于您在控制器中對用戶模型使用依賴注入,因此您可以在控制器中執(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)行查詢。

這樣做的好處是

  1. 更清晰的控制器

  2. 控制器將只負(fù)責(zé)接收請求、傳遞所需的數(shù)據(jù)并將結(jié)果傳遞給索引。

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

  4. 責(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;

}

  1. 我們返回 eloquent 實(shí)例而沒有這樣做的原因 $query->get()是,通過這種方式,我們可以在控制器中執(zhí)行此操作,并且對于重用此代碼的每個(gè)地方,我們可以根據(jù)需要執(zhí)行諸如orderBygroupBy、first和其他操作之類的操作get我們調(diào)用它的地方。因?yàn)槿绻阕隽艘粋€(gè),$query->get()你就會受到唯一的限制Collection。

  2. 之后,我們可以在控制器中執(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ù)需要過濾它們來滿足您的需求。


查看完整回答
反對 回復(fù) 2023-07-07
  • 2 回答
  • 0 關(guān)注
  • 155 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號