【问题标题】:Relationship between 2 tables with a relationship table2个表之间的关系与一个关系表
【发布时间】:2019-12-17 23:01:38
【问题描述】:

我有 3 个表格,如下图:

https://i.imgur.com/zL7ouGu.png

我创建了用户和组织之间的关系表

我想检索包含每个用户的组织列表的集合。

目前我正在收集一个用户多次返回的集合。

Collection {#226 ▼
  #items: array:4 [▼
    0 => {#232 ▼
      +"name": "GotExx"
      +"avatar_path": "gotexx.jpg"
      +"orga-name": "My orga 1"
      +"slug": "my-orga-1"
      +"orga-avatar": "myorga1_logo.png"
    }
    1 => {#228 ▼
      +"name": "GotExx"
      +"avatar_path": "gotexx.jpg"
      +"orga-name": "My orga 2"
      +"slug": "my-orga-2"
      +"orga-avatar": "myorga2_logo.png"
    }
    2 => {#234 ▼
      +"name": "GotExx"
      +"avatar_path": "gotexx.jpg"
      +"orga-name": "My orga 3"
      +"slug": "my-orga-3"
      +"orga-avatar": "myorga3_logo.png"
    }
    3 => {#233 ▼
      +"name": "root"
      +"avatar_path": null
      +"orga-name": "My orga 2"
      +"slug": "my-orga-2"
      +"orga-avatar": "myorga2_logo.png"
    }
  ]
}
select users.name, users.avatar_path, organizations.name, organizations.slug, organizations.avatar_path 
from relation_organization
right join users on relation_organization.user_id = users.id
left join organizations on relation_organization.organization_id = organizations.id

理想情况下,我想得到这个:

Collection {#226 ▼
  #items: array:2 [▼
    0 => {#232 ▼
      +"name": "GotExx"
      +"avatar_path": "gotexx.jpg" 
      +"organizations" => {
        0 => {
          +"orga-name": "My orga 1"
          +"slug": "my-orga-1"
          +"orga-avatar": "myorga1_logo.png"
        }
        1 => {
          +"orga-name": "My orga 2"
          +"slug": "my-orga-2"
          +"orga-avatar": "myorga2_logo.png"
        }
        2 => {
          +"orga-name": "My orga 3"
          +"slug": "my-orga-3"
          +"orga-avatar": "myorga3_logo.png"
        }
      }
    }
    1 => {#232 ▼
      +"name": "root"
      +"avatar_path": "null" 
      +"organizations" => {
        0 => {
          +"orga-name": "My orga 2"
          +"slug": "my-orga-2"
          +"orga-avatar": "myorga2_logo.png"
        }
      }
    }
  ]
}

【问题讨论】:

    标签: sql laravel relationship


    【解决方案1】:

    Laravel 首选方式。

    1. 创建模型。
    2. 定义关系。
    3. 检索数据时使用预先加载。

    创建模型和关系。

    用户模型

    public class User extends Model
    {
        public function organizations()
        {
            return $this->belongsToMany(Organization::class);
        }
    }
    

    组织模式

    public class Organization extends Model
    {
        public function users()
        {
            return $this->belongsToMany(User::class);
        }
    }
    

    在获取时使用预先加载。

    控制器功能

    $usersWithOrganizations = User::with('organizations')->get();
    

    【讨论】:

    • 太好了,它完美运行,我想我可以链接约束?假设我想从组织中恢复用户,我只需要执行$organizationWithUsers = Organization::with('users')->where('organization_id', $organization->id)->get(); 之类的操作?
    • 是的,您可以像这样向organizations 表添加约束。
    【解决方案2】:

    这就是 Laravel 真正在人际关系方面大放异彩的地方。将usersorganizations 全部放在一个查询中进行热切加载。例如

    $users = User::with('organizations')->get().  
    

    您的$users 现在将根据您的问题将系统中的所有用户及其附属的组织按每个用户列出一次。

    如果您想像在 SQL 中那样限制绘制的字段,可以使用 select:

    $users = User::select('avatar_path', 'name')->with(['organizations' => function($query){
          $query->select('name', 'slug', 'avatar_path );
    }])->get().  
    

    这一切都假设您在 Users 模型上正确设置了 organizations 关系。

    【讨论】:

      猜你喜欢
      • 2021-10-31
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多