我设置了以下数据库表
+--------------+ +--------------+ +-----------------------+
| users | | clients | | user_clients |
+--------------+ +--------------+ +----------------------+
| id | | id | | usersid |
| name | | name | | clientid |
| authid | | email | +----------------------+
| (plus) | | (plus) |
+-------------+ +-------------+
我已经设置了一个关系表 [b]user_clients[/b] 与相关数据库的外键,因此 userid 链接到 users->id,客户端 id 链接到客户端>id。
取决于用户身份验证是链接的客户端数量:
身份验证 1:用户只能有一个客户端关联。
身份验证 2:用户只能有一到多个客户端与之关联
身份验证 3:用户可以访问所有客户端。
因此,由于我目前是 laravel 关系方面的新手,我会做很多查询以获取一些详细信息,例如:
我会做这样的事情:
$userClient =UsersClients::select('clientid')->where('userid','=',$userid)->get();
然后我可能会循环浏览结果,然后获取每个客户端的详细信息并输出到页面。
foreach($userClient as $i ->$cleint){
echo '<div>' .$cleint->name . '</div>';
........
}
这会是一种旧方法吗,可以处理得更好吗?
----------------编辑---------------
我设法将其排序如下:
用户型号:
public function clients() {
return $this->hasMany('UsersClients','userid');
}
用户控制器
$selectedUserClients = User::find(24)->clients;
我得到的结果与客户端 ID 的 1 和 2 中的结果相同,但现在如何从实际的客户端数据库中获取客户端详细信息基本上是一种更简单的方法:
foreach ($selectedUserClients as $key => $client) {
$clientInfo = Client::select('id','clientname')->where('id','=',$client->clientid)->get();
echo $clientInfo[0]->clientname;
}
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;
我还想提一下,最佳做法是为您的身份证使用蛇形大小写,例如 user_id
或 client_id
.
表名应为复数形式。 users
和clients
.
数据透视表应按字母顺序snake_case,并单数。 client_user
.
这将使与 Eloquent 合作变得更加容易,因为在建立关系时您不必担心,并且其他人可能更容易帮助您处理您的项目。
而不是return $this->belongsToMany('Client','user_clients','userid','clientid');
您所要做的就是return $this->belongsToMany('Client');
哪个应该使您的应用程序更干净,更易于阅读。