Laravel 4.2 - 在相关表上使用 where 子句
Laravel 4.2 - Use where clause on related tables
我正在使用两个模型,UserType
和 User
- UserType
hasMany User
.
我正在尝试检索与 属性 receive_email
设置为 1(真)的 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();
我看到很多人说这不是使用预加载约束的正确方法,但我真的不知道那是什么,他们似乎什么也没做。那么,简短的问题是,如何通过 UserType
关系检索 receive_email
设置为 1 的 Users
列表?
更新
有人可以向我解释上面文档中的示例代码应该做什么吗?我假设它应该 return 与用户相关联的帖子匹配具有标题 LIKE "first." 的约束 在我的例子中,我试图找到与每个用户具有的 UserTypes 相关联的用户receive_email
设置为 1。我的代码和示例代码之间的唯一显着差异是我正在应用 whereIn()
并且模型名称不同。
那么,根据示例的结果,以下是否成立?
foreach ($users as $user) {
foreach ($user->posts as $post) {
// matching posts with titles LIKE "first"
}
}
我不是 100% 熟悉人际关系,他们总是有点棘手。但是据我了解,您希望 UserType
1 和 10 中的所有 Users
都将 receive_emails
设置为 1。因此,这应该有效:
$result =
UserType::whereIn("id", array(1, 10))
->first()
->users()
->where("receive_email", "=", 1)
->whereNotNull("emails")
->whereNull("status")
->get()
;
这应该做的是 return 来自 UserType
的 id 1 和 10 的所有可访问字段以及来自 User
table 的所有字段。如果您在此查询中 运行 a dd($result)
,您应该看到 UserType
id 1 的条目连接到所有 receive_email
设置为 1 的 Users
,和另一组 UserType
id 10.
我不能保证在没有看到你的 UserType.php
和 User.php
类 的情况下这会起作用,因为可能没有设置关系,但如果你遵循 Laravel约定:
public function users(){
return $this->hasMany("User");
}
反之
public function userType(){
return $this->belongsTo("UserType");
}
那么应该可以了。希望这可以帮助!另外,我确信有更好的方法来实现这一点,但这是我想出的,它似乎适用于我现有的一些有关系的项目。
干杯!
如果您在寻找用户列表,那么我建议您实际上从该模型开始,并利用 whereHas
按用户类型进行过滤:
$users = User::where('receive_email', 1)
->whereNotNull('email')
->whereNull('status')
->whereHas('UserType', function($q){
$q->whereIn('id', [1, 10]);
})
->get();
实际上,由于用户类型 ID 应该作为外键存在于用户 table 中,您甚至不需要 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();
我正在使用两个模型,UserType
和 User
- UserType
hasMany User
.
我正在尝试检索与 属性 receive_email
设置为 1(真)的 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();
我看到很多人说这不是使用预加载约束的正确方法,但我真的不知道那是什么,他们似乎什么也没做。那么,简短的问题是,如何通过 UserType
关系检索 receive_email
设置为 1 的 Users
列表?
更新
有人可以向我解释上面文档中的示例代码应该做什么吗?我假设它应该 return 与用户相关联的帖子匹配具有标题 LIKE "first." 的约束 在我的例子中,我试图找到与每个用户具有的 UserTypes 相关联的用户receive_email
设置为 1。我的代码和示例代码之间的唯一显着差异是我正在应用 whereIn()
并且模型名称不同。
那么,根据示例的结果,以下是否成立?
foreach ($users as $user) {
foreach ($user->posts as $post) {
// matching posts with titles LIKE "first"
}
}
我不是 100% 熟悉人际关系,他们总是有点棘手。但是据我了解,您希望 UserType
1 和 10 中的所有 Users
都将 receive_emails
设置为 1。因此,这应该有效:
$result =
UserType::whereIn("id", array(1, 10))
->first()
->users()
->where("receive_email", "=", 1)
->whereNotNull("emails")
->whereNull("status")
->get()
;
这应该做的是 return 来自 UserType
的 id 1 和 10 的所有可访问字段以及来自 User
table 的所有字段。如果您在此查询中 运行 a dd($result)
,您应该看到 UserType
id 1 的条目连接到所有 receive_email
设置为 1 的 Users
,和另一组 UserType
id 10.
我不能保证在没有看到你的 UserType.php
和 User.php
类 的情况下这会起作用,因为可能没有设置关系,但如果你遵循 Laravel约定:
public function users(){
return $this->hasMany("User");
}
反之
public function userType(){
return $this->belongsTo("UserType");
}
那么应该可以了。希望这可以帮助!另外,我确信有更好的方法来实现这一点,但这是我想出的,它似乎适用于我现有的一些有关系的项目。
干杯!
如果您在寻找用户列表,那么我建议您实际上从该模型开始,并利用 whereHas
按用户类型进行过滤:
$users = User::where('receive_email', 1)
->whereNotNull('email')
->whereNull('status')
->whereHas('UserType', function($q){
$q->whereIn('id', [1, 10]);
})
->get();
实际上,由于用户类型 ID 应该作为外键存在于用户 table 中,您甚至不需要 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();