Laravel 4:在laravel中表示此db结构/关系的更好方法

时间:2013-07-15 15:31:38

标签: laravel laravel-4 relationship

我有以下数据库表设置

  +--------------+    +--------------+    +-----------------------+
  |   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;
  }

1 个答案:

答案 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_idclient_id

您的表名应为复数。 usersclients

您的数据透视表应该是snake_case,按字母顺序排列,并且是单数。 client_user

这样可以更轻松地使用Eloquent,因为在建立关系时你不必担心,而其他人可能更容易帮助你处理你的项目。

而不是return $this->belongsToMany('Client','user_clients','userid','clientid');所有你需要做的就是return $this->belongsToMany('Client');这应该让你的应用程序更清晰,更容易阅读。