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

How can I fetch Laravel models by matching a value on a relationship?

我有一个 User 模型,其中包含登录、ID、年龄等属性。例如,另一个 table 是 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');
}

现在我得到这个错误:

Column not found: 1054 Unknown column 'residence' in 'where clause' (SQL: select * from `users` where `residence` = warsaw and `users`.`deleted_at` is null)

还有一个问题:

如果User是我的主要模型,我应该把它和上面的关系联系起来吗? hasMany()belongsTo()?

使用 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();

如果您想获取与特定属性有关系的所有用户,请使用 whereHas,如下所示:

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