如何将其转换为一个很好的Eloquent查询

时间:2013-07-22 14:54:24

标签: php mysql laravel-4 relationship eloquent

如何使用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');
}

2 个答案:

答案 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_onwhereand_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

我希望这有帮助!