我正在使用两个模型,UserType
和User
- 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()
答案 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.php
和User.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();