如何使用Eloquent查询所有没有特定类型证书的用户?
Laravel 4
我有两张桌子:
users table:
->id
->name
certificats table:
->id
->user_id
->certificate_type
我现在几个小时都在挣扎。我试过的最后一件事是:
$users = User::with(array('certificate' => function($query)
{
$query->where('type','!=','SL');
}))->get();
这给了我所有用户,但我试图让没有证书类型'SL'的所有用户。
- 编辑 下面是Spencer7593的原始查询。但我没有得到有说服力的查询。
SELECT u.*
FROM users u
LEFT
JOIN certificates c
ON c.user_id = u.id
AND c.type = 'SL'
WHERE c.user_id IS NULL
关系:
public function certificate(){
return $this->hasMany('Certificate');
}
public function certificate(){
return $this->belongsTo('User');
}
答案 0 :(得分:1)
获取所需结果集的SQL非常简单。
SELECT u.*
FROM users u
LEFT
JOIN certificates c
ON c.user_id = u.id
AND c.type = 'SL'
WHERE c.user_id IS NULL
这是一种熟悉的模式,称为“反连接”。基本上,它是LEFT JOIN查找匹配的行,以及users
中没有匹配的行,然后过滤掉所有匹配的行,我们留下来自{{{ 1}}没有匹配。
诀窍是让Eloquent为你生成SQL。要让Eloquent这样做,你需要告诉eloquent做一个LEFT JOIN,并添加一个WHERE子句,
也许这样的事情会很接近:
users
<强>后续强>
(为了那些可能不会阅读评论的人的利益)
Klass Terst(OP)报告了Eloquent尝试中的语法问题(在上面的答案中):->left_join('certificate AS c', function($join){
$join->on('c.user_id','=','user.id');
$join->and_on('c.type','=','SL');
})
->where_null('c.user_id')
需要替换为left_join
,而leftJoin
不是认可。 (后者可能是我的发明,基于and_on
,where
,and_where
中使用的惯例。)
or_where
答案 1 :(得分:0)
我认为问题出在你的人际关系中。
模型
class User extends Eloquent
{
public function certificates()
{
return $this->hasMany('Certificate');
}
}
class Certificate extends Eloquent
{
public function user()
{
return $this->belongsTo('User');
}
}
控制器
$users = User::with(array('certificates' => function($query)
{
$query->where('type','!=','SL');
}))->get();
return View::make('yourView')->with('users',$users);
查看
@foreach($users as $user)
{{ $user->name }} // User's name
@foreach($user->certificates as $certificate)
{{ $certificate->certificate_type }} // Certificate type shouldn't be 'SL'
@endforeach
@endforeach
我希望这有帮助!