我有以下数据库表设置
+--------------+ +--------------+ +-----------------------+
| users | | clients | | user_clients |
+--------------+ +--------------+ +----------------------+
| id | | id | | usersid |
| name | | name | | clientid |
| authid | | email | +----------------------+
| (plus) | | (plus) |
+-------------+ +-------------+
我已经设置了一个关系表[b] user_clients [/ b],其中包含相关数据库的外键,因此userid链接到users-> id,clientid链接到clients-> id。
取决于用户Authid是链接的客户端数量:
Authid 1:用户只能有一个与之关联的客户端。
Authid 2:用户只能拥有一对多的客户端
Authid 3:用户可以访问所有客户端。
因为我是laravel的这个关系方面的新手,我现在会做很多查询以获得一些细节,例如:
我会做类似的事情:
$userClient =UsersClients::select('clientid')->where('userid','=',$userid)->get();
然后我可能会遍历结果,然后获取每个客户端的详细信息并输出到页面。
foreach($userClient as $i ->$cleint){
echo '<div>' .$cleint->name . '</div>';
........
}
这是一种古老的方式,可以更好地处理吗?
---------------- EDIT ---------------
我设法将其排序如下:
用户模型:
public function clients() {
return $this->hasMany('UsersClients','userid');
}
用户控制器
$selectedUserClients = User::find(24)->clients;
我得到的结果与我之前的结果相同,如客户端ID 1&amp; 2,但现在如何从实际客户端db获取客户端详细信息基本上有一种更简单的方式:
foreach ($selectedUserClients as $key => $client) {
$clientInfo = Client::select('id','clientname')->where('id','=',$client->clientid)->get();
echo $clientInfo[0]->clientname;
}
答案 0 :(得分:1)
users_clients表需要它自己的ID列才能使多对多关系起作用。
在您的用户模型上,尝试
public function clients()
{
return $this->belongsToMany('Client','user_clients','userid','clientid');
}
现在,您可以找到分配给每个用户的客户端
User::find(24)->clients
。
您也可以在客户端模型上进行反向...
public function users()
{
return $this->belongsToMany('User','user_clients','clientid','userid');
}
这将允许您查找属于每个客户端的所有用户
Client::find(42)->users;
我还想提一下,最好的做法是为你的id使用snake case,例如user_id
或client_id
。
您的表名应为复数。 users
和clients
。
您的数据透视表应该是snake_case,按字母顺序排列,并且是单数。 client_user
。
这样可以更轻松地使用Eloquent,因为在建立关系时你不必担心,而其他人可能更容易帮助你处理你的项目。
而不是return $this->belongsToMany('Client','user_clients','userid','clientid');
所有你需要做的就是return $this->belongsToMany('Client');
这应该让你的应用程序更清晰,更容易阅读。