如何在 Laravel 4 中选择相关模型计数为 0 的模型?

Posted

技术标签:

【中文标题】如何在 Laravel 4 中选择相关模型计数为 0 的模型?【英文标题】:How to select models with related models count 0 in Laravel 4? 【发布时间】:2013-08-07 06:07:34 【问题描述】:

我正在使用 Laravel 4 框架开发 php 应用程序。我已经设置了用户和角色模型。角色可以属于多个用户,一个用户可以拥有多个角色。我想选择没有任何角色的用户。如何使用 Laravel 的 ORM 进行查询?

这是我的 Role.php

class Role extends Eloquent 

    protected $table = 'roles';

    public function users() 
       return $this->belongsToMany('User', 'user_roles');
    


在我的 User.php 中有这段代码:

public function roles() 
    return $this->belongsToMany('Role', 'user_roles');

我已经尝试了下面的代码,但即使我创建了没有角色的用户,它也不会返回任何用户。

User::has('roles', '=', 0)->paginate(15);

下面的代码有效,但用户是 stdClass 对象。我需要它们成为用户对象。

$users = DB::table('users')->whereNotIn('id', function($query)
            $query->select('user_id')->from('user_roles');
         )->paginate(15);

编辑

为 User::has('roles', '=', 0)->paginate(15) 添加了查询日志

array(3) ["query"]=> string(189) "select * from "users" where (select count(*) from "roles" inner join "user_roles" on "roles"."id" = "user_roles"."role_id" 其中 "user_roles"."user_id" = "users"."id") = ?限制 15 偏移量 0" ["bindings"]=> array(1) [0]=> int(0) ["time"]=> float(0.11)

【问题讨论】:

User::has('roles', '=', 0)->paginate(15); 检查该语句生成的查询。 (它将查看用户是否具有 ID 0 不应该存在的角色。使用 where NOT EXISTS$users = DB::table('users')。您查询一个表,您不要求框架提供模型。(我不知道 laravel,所以我不能告诉你如何解决这个问题) 我认为 User:has('roles', '=', 0) 按计数而不是按 id 查询。看到这个:laravel.com/docs/eloquent#querying-relations 如果用户未设置角色,则您的数据库上的值是否设置为0nullUser::has('roles','=',0)->paginate(15) 应该可以工作。如果值null 被设置为未分配的角色,则将该列设置为默认值0 并再次检查 【参考方案1】:

试试这个:

User::whereNotIn('id', function($query)
        $query->select('user_id')->from('user_roles');
     )->paginate(15);

【讨论】:

以上是关于如何在 Laravel 4 中选择相关模型计数为 0 的模型?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4 - 选择相关模型

你如何在 Laravel 4 中插入相关的多态模型

在模型 laravel 的所有选择中显示相关表列

Laravel HasMany 查询最新入口并返回相关模型

在 laravel 中,我如何生成一个计数数组?

Laravel 关系多对多按外键计数相关数据