Laravel 4.2 - 在相关表上使用where子句

时间:2015-03-09 18:26:53

标签: laravel laravel-4 eloquent

我正在使用两个模型,UserTypeUser - UserType hasMany User

我正在尝试检索与属性receive_email设置为1(true)的UserType关联的用户列表。

我试过了:

$userGroups = UserType::with(['Users' => function($query) {
        $query->whereReceiveEmail(1)->whereNotNull('email')->whereNull('status');
    }])->whereIn('id', [10, 1])->get();

并且Where子句似乎完全被忽略了。来自Laravel 4.2文档 -

$users = User::with(array('posts' => function($query)
{
    $query->where('title', 'like', '%first%');

}))->get();

我见过很多人说这不是使用急切加载限制的正确方法,但我真的不知道那会是什么,他们似乎什么也没做。那么,简短的问题是,如何通过Users关系检索receive_email的{​​{1}}列表设置为1?


更新 有人可以向我解释一下上面文档中的示例代码应该做什么吗?我假设它应该返回与用户匹配的帖子,这些帖子符合标题LIKE" first的约束。"在我的情况下,我尝试查找与UserTypes相关联的用户,其中每个用户UserType设置为1.我的代码与示例代码之间的唯一显着差异是我正在应用receive_email并且型号名称不同。

那么,根据示例的结果,以下是真的吗?

whereIn()

2 个答案:

答案 0 :(得分:1)

我不是100%熟悉人际关系,他们总是有点棘手。但根据我的理解,您希望Users 1和10中UserType的{​​{1}} receive_emails设置为1.所以,这应该有效:

$result = 
  UserType::whereIn("id", array(1, 10))
  ->first()
  ->users()
  ->where("receive_email", "=", 1)
  ->whereNotNull("emails")
  ->whereNull("status")
  ->get()
;

这应该做的是返回UserType的id 1和10以及User表中所有字段的所有可访问字段。如果您对此查询运行dd($result),则会看到UserType ID 1的条目已连接到Users设置为1的所有receive_email,另一个条目设置为UserType id 10。

我不能保证这会在没有看到你的UserType.phpUser.php类的情况下工作,因为可能没有设置关系,但如果你遵循Laravel惯例:

public function users(){
  return $this->hasMany("User");
}

和反向

public function userType(){
  return $this->belongsTo("UserType");
} 

然后它应该工作。希望这可以帮助!此外,我确信有更好的方法可以实现这一目标,但这就是我想出来的,它似乎适用于我现有的一些有关系的项目。

干杯!

答案 1 :(得分:1)

如果您正在查看用户列表,那么我建议您实际上从该模型开始,并使用whereHas按用户类型进行过滤:

$users = User::where('receive_email', 1)
             ->whereNotNull('email')
             ->whereNull('status')
             ->whereHas('UserType', function($q){
                 $q->whereIn('id', [1, 10]);
             })
             ->get();

实际上,由于用户类型ID应该在users表中作为外键存在,因此您甚至不需要whereHas

$users = User::where('receive_email', 1)
             ->whereNotNull('email')
             ->whereNull('status')
             ->whereIn('user_type_id', [1, 10]);
             ->get();

对于RosterMember,它基本相同。虽然现在你必须使用whereHas,因为它是多对多的关系:

$rosterMembers = RosterMember::where('receive_email', 1)
                 ->whereNotNull('email')
                 ->whereHas('UserType', function($q){
                     $q->whereIn('user_type_id', [1, 10]);
                 })
                 ->get();