使用`with`和`where`在Laravel中创建查询

时间:2014-01-27 16:19:02

标签: php laravel laravel-4 subquery

我想知道可以向where添加with条件。

如:

Comment::with('Users')->where('allowed', 'Y')->get();

我试图找到一种更简单的方法来进行查询,避免使用看似相当冗长的whereHas方法:

$users = Comment::whereHas('users', function($q)
{
    $q->where('allowed', 'Y');

})->get();

我想在内部生成的原始查询应该是这样的:

select * from comments, users
where users.id = comments.user_id and
users.allowed = 'Y'

我习惯使用CakePHP,其中查询看起来非常简单:

$this->Comments->find('all', array('Users.allowed' => 'Y'));

我定义的关系是:

//Comments.php
public function Users()
{
    return $this->belongsTo('Users');
}

//Users.php
public function Comments(){
    return $this->hasMany('Comments');
}

1 个答案:

答案 0 :(得分:1)

你可以试试这个

$users = User::with(array('comments' => function($q)
{
    $q->where('attachment', 1);

}))->get();

更新:或者,您可以在User模型中使用关系中的where子句

// Relation for comments with attachment value 1
// and if hasMany relation is used
public function commentsWithAttachment()
{
    return $this->hasMany('Comment')->where('attachment', 1);
}

// Relation for all comments
// and if hasMany relation is used
public function comments()
{
    return $this->hasMany('Comment');
}

所以,你可以使用

// Comments with attachment value 1
User::with('commentsWithAttachment')->get();

// All comments
User::with('comments')->get();

更新:我认为您希望所有评论都与用户的附件为1,如果这是你想要的那么它应该是评论不是用户

Comment::with('user')->where('attachment', 1)->get();

在这种情况下,你的关系应该是

public function user()
{
    return $this->belongsTo('User'); // if model name is User
}

因为一条评论只属于一个用户。