如何使用数据透视表October Cms对结果进行范围划分

问题描述

解决方案可能很简单,我只是想念它,但是我似乎无法弄清楚如何根据客户所属的“用户”来限制“客户”。

这是一个多对多关系,因此一个客户可以属于多个用户,而一个用户可以拥有多个客户。

这是我的关系定义:

public $belongsToMany = [
    'user_id' => [
        'RainLab\User\Models\User','table' => 'tablename_users_customers',]
];

这是作用域函数,无法正常运行:

public function scopeUser($query) {
    $user = Auth::getUser()->id;
    return $query->where('user_id',$user)->get();
}

最后,这是我的错误

sqlSTATE[42S22]: Column not found: 1054 UnkNown column 'user_id' in 'where clause' (sql: select * from `tblcustomers` where `user_id` = 1)

显然,该错误是因为“ user_id”列在“ tblcustomers”表中不存在,而在数据透视表中不存在。如何在作用域函数中使用数据透视表中的“ user_id”?我只需要显示属于当前登录用户的客户。

解决方法

是可以的

但是第一件事是您需要从范围get()对象中删除scope meant to return query方法以进一步链接方法。

您的关系和范围应如下所示

// relation
public $belongsToMany = [
    // PLEASE MAKE RELATION NAME CORRECT HERE
    'users' => [  // not user_id,use `users`
        'RainLab\User\Models\User','table' => 'tablename_users_customers',// 'key' => 'customer_id',if needed
        // 'otherKey' => 'user_id' if needed
    ]
];


// scope
use RainLab\User\Models\User;
public function scopeUser($query) {    
    return $query->whereHas('users',function($usersQuery) {
        $user_id = Auth::getUser()->id;
        return $usersQuery->where((new User)->getTable() . '.id',$user_id);       
    });
}

// usage
$result = Customer::user()->get();
dd($result);  
// you will get only customers which has relation with current logged in user. 

如有任何疑问,请发表评论。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...