如何使用 pivot table October Cms 确定结果范围
How to scope results with pivot table 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' table 中,而是存在于主元 table 中。如何在范围函数中使用枢轴 table 中的“user_id”?我只需要显示属于当前登录用户的客户。
是的,这是可能的
但首先您需要从作用域中删除 get()
方法,scope meant to return query
对象以进一步链接方法。
Your relation and scope should look like this
// 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.
如有疑问请评论。
这个问题的解决方案可能很简单,我只是想念它,但我似乎无法弄清楚如何根据客户所属的“用户”来限制“客户”。
这是多对多的关系,一个客户可以属于多个用户,一个用户可以有多个客户。
这是我的关系定义:
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' table 中,而是存在于主元 table 中。如何在范围函数中使用枢轴 table 中的“user_id”?我只需要显示属于当前登录用户的客户。
是的,这是可能的
但首先您需要从作用域中删除 get()
方法,scope meant to return query
对象以进一步链接方法。
Your relation and scope should look like this
// 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.
如有疑问请评论。