【问题标题】:How can I fetch Laravel models by matching a value on a relationship?如何通过匹配关系上的值来获取 Laravel 模型?
【发布时间】:2018-03-06 23:02:48
【问题描述】:

我有一个 User 模型,其中包含登录名、ID、年龄等属性。例如,另一个表是 user_dataresidence 列。

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

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 子句'中的未知列'residence'(SQL:select * from `users` where `residence` = warsaw and `users`.`deleted_at` is null)

还有一个问题:

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

【问题讨论】:

  • 制作一个 sql squery 来获取它:laravel.com/docs/5.5/queries
  • @peter 正如你在上面看到的,我尝试了很多次,但它不起作用

标签: php laravel laravel-eloquent


【解决方案1】:

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

【讨论】:

  • 那行得通。但是如何将华沙更改为 $request->city?我有 $request 作为函数参数 put id 现在不起作用
  • 最后一个问题。我无法执行 $user->id 之类的操作,因为:此集合实例上不存在属性 [id] 如何正确执行?
  • 构建器末尾的get() 方法返回一个包含与查询匹配的所有用户的集合。如果只需要一个用户,则需要将用户 ID 传递给要获取的用户的 FilterUser() 方法,并将 get() 更改为 first(),或遍历集合中的每个用户。跨度>
  • 我想显示所有用户,但是使用foreach时它不起作用
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2016-08-04
    • 2016-08-20
    相关资源
    最近更新 更多