【问题标题】:Filter on laravel pivot table在 laravel 数据透视表上过滤
【发布时间】:2014-07-22 23:50:37
【问题描述】:

我在Laravel 中有两个表与数据透视表相连。这两个表是usersroles,数据透视表称为role_user。数据透视表还包含两个额外字段:startstop。这样我就可以跟踪user 过去曾担任过哪些角色。

现在我想创建一个查询来获取当前拥有role_id = 3 的所有users

首先我使用的是WherePivot,但显然那是bugged

我现在使用Eloquent 进行了以下查询:

Role::with('User')
    ->where('id', '=', '3')
    ->where('role_user.start', '<', date('Y-m-d'))
    ->where('role_user.stop', '>', date('Y-m-d'))
    ->whereHas('users', function($q){
        $q->where('firstname', 'NOT LIKE', '%test%');
    })
    ->get();

但不知何故,我收到一个错误,即找不到数据透视表的列开始。但我可以在PHPMyAdmin 中确认该列存在。

这是整个错误:

Illuminate \ Database \ QueryException
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'klj_role_user.start' in 'where clause' (SQL: select * from `klj_roles` where `id` = 3 and `klj_role_user`.`start` < 2014-06-02 and `klj_role_user`.`stop` > 2014-06-02 and (select count(*) from `klj_users` inner join `klj_role_user` on `klj_users`.`id` = `klj_role_user`.`user_id` where `klj_role_user`.`role_id` = `klj_roles`.`id` and `firstname` NOT LIKE %test%) >= 1)

谁能告诉我我做错了什么或给我提示我现在应该在哪里寻找?

【问题讨论】:

    标签: php mysql laravel laravel-4 eloquent


    【解决方案1】:

    错误是告诉您缺少数据透视表klj_role_user 中的start 列。您应该做的是创建列。如果该列已经存在,请确保您使用的是正确的数据库。

    我还稍微简化了您的查询。您实际上并不需要whereHas,因为您不是试图通过关联的用户来限制您的角色,而是通过id,在这种情况下,您使用的是3with() 可以很好地工作,wherePivot()with() 结合使用时似乎对我来说工作正常。

    $role = Role::with(array('users' => function($q)
    {
        $q->wherePivot('start', '>', date('Y-m-d H:i:s'));
        $q->wherePivot('stop', '<', date('Y-m-d H:i:s'));
        $q->where('firstname', 'NOT LIKE', '%test%');
    }))->find(3);
    
    
    foreach($role->users as $user) {
        echo $user->firstname;
    }
    

    【讨论】:

    • 谢谢,这确实有效!您在stopstart 之间更改了&gt;&lt;,但我不得不稍微搜索一下才能找到那个错误。 :p
    • 哦,对不起,哈哈,在处理我的测试数据时搞砸了,忘了把它改回来。很高兴这对你有用。
    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 2016-02-12
    • 2017-10-17
    • 2014-01-12
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多