如何通过匹配关系中的值来获取Laravel模型?

时间:2017-09-25 21:15:10

标签: php laravel laravel-eloquent

我有一个User模型,其中包含登录,ID,年龄等属性。例如,另一个表格为user_data,其中包含residence列。

如何让所有具有特定住所的用户?我有这个:

User型号:

public function user_data()
{
    return $this->hasMany('App\Models\UserData');
}

public function FilterUser($request)
{
    if ($request->has('city')) 
    {
        $users = User::with('user_data')->where('residence', 'Warsaw')->get();        
    }

    dd($users);
}

UserData型号:

public function user()
{
    return $this->belongsTo('App\User', 'user_id');
}

现在我收到了这个错误:

  

未找到专栏:1054未知专栏'住所'在' where子句' (SQL:select * from`users`,其中`residence` = warsaw,`users` .deleted_at`为null)

另一个问题:

如果User是我的主要模特,我应该将其与上述关系联系起来吗? hasMany()belongsTo()

2 个答案:

答案 0 :(得分:2)

使用whereHas()查询构建器方法:

$users = User::with('user_data') 
    ->whereHas('user_data', function($query) { 
        $query->where('residence', 'Warsaw'); 
    })
    ->get();

编辑 - 要使用$request中的值,您需要将变量导入whereHas()的闭包中:

    ...
    ->whereHas('user_data', function($query) use ($request) {
        $query->where('residence', $request->city);
    })
    ...

编辑 - query scope可能是更好的方法。在User模型中,添加此方法:

function scopeInCity($query, $city)
{
    return $query->whereHas('user_data', function($q) use ($city) {
        $q->where('residence', $city);
    });
}

然后您可以按城市(模型外)过滤所有用户:

User::inCity($request->city)->get();

答案 1 :(得分:0)

如果您希望获得与特定属性具有关系的所有用户,请使用whereHas:

$users = User::whereHas('user_data', function($q) {
$q->where('residence', 'Warsaw');})->get();