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

Laravel 4.2 - Use where clause on related tables

我正在使用两个模型,UserTypeUser - 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.phpUser.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();