加入belongsToMany并获取所有列

Posted

技术标签:

【中文标题】加入belongsToMany并获取所有列【英文标题】:Joining belongsToMany and getting all columns 【发布时间】:2018-03-29 15:55:56 【问题描述】:

我有这个方法:

公共功能菜单组() return $this->belongsToMany(Layout::class, '_layout_pivot', 'side_menu_item_id', 'side_menu_group_id')->withTimestamps();

结果是这样的(循环之一):

"id" => 1
“标签” => “系统/menu.settings_group”
“图标” => “图标设置”
“排序” => 10
“system_employee_id”=> 10
"created_at" => "2017-07-19 03:24:06"
"updated_at" => "2017-07-17 00:00:00"

我还有表“system_employees”(只有几个示例列):

+----+----------------+------------+-----------+ -----+----------+----------+
|编号 |用户名 |名字 |姓氏 |年龄 | created_at |更新时间 |
+----+----------------+-----------+------------+--- --+----------+----------+
| 1 |拉奎尔46932071 |拉奎尔 |海勒 | 25 | 2017-04-26 05:03:43 | 2017-07-03 21:13:37 |
| 2 |布兰特13975229 |布兰特 |罗森鲍姆 | 30 | 2017-04-25 21:34:46 | 2017-05-07 09:28:27 |
+----+----------------+-----------+------------+--- --+----------+----------+

system_employee_id from >belongsToMany 是 system_employees 的外键,等于 system_employees.id

我正在尝试将两者结合起来,以获得 system_employee 名称。

编辑(根据 aynber 评论):

我加入这两个并使用 paginate(),所以我不能使用 get 和 select,或者为列添加前缀:

$this->menuGroups
->leftJoin('system_employees', 'system_employees.id', '=', '_layout_side_menu_groups.system_employee_id')
->分页($pages, $columns, $pageName, $page);

这就是我得到的:

"id" => 18
        "label" => "Some Insert Tester"
        “图标” => “insico”
        “排序” => 39
        “system_employee_id”=> 18
        "created_at" => "2017-07-03 00:28:05"
        "updated_at" => "2017-07-03 00:28:05"
        “类型” => 4
        "system_id" => 0
        "用户名" => "System2017"
        “名字” => “丽塔”
        “姓氏” => “维刚”
        “年龄” => 0
        “性别” => “”
        “电子邮件” => “system@gmail.com”
        “移动”=>“”
        “rank_id” => 1
        “rank_title” => “”
        “状态”=> 1
        “头像” => “mysite.com/img/14161939651400nds6k.jpg”
        “密码” => “$2y$10$FIL4LmjLVEZ6SgUsRILqPutTEcaGWcmKyIHwPOBbQfHDYdJM5//2。”
        "remember_token" => "vUI812NTJZ8RWrlX3g3quBy4quVrue1dnOVZEPzifRJdy85cJPQY7RclYNHU"

问题

如何在不使用查询生成器的情况下从两个表中获取“created_at”、“updated_at”? 这同样适用于两个表中具有相同名称的任何其他列。

换句话说:有没有办法在 belongsToMany 中为列添加前缀?

【问题讨论】:

你必须指定你想要的列,并用AS为重复的列命名。 How to alias the name of a column in Eloquent的可能重复 @aynber 感谢您指出其他答案。但在我的问题中,我忘了补充,我使用的是 paginate(),所以我不能使用 get()。 您可以使用select('menu_groups.*, system_employees.id AS se_id, ...')。但是,如果您使用的是 Eloquent,为什么不直接使用 with() 加载菜单项及其关系? @fubar 谢谢你的回答。我不知道如何将 with() 与 belongsToMany() 结合起来,我想继续使用它。所以我找到了另一个解决方案。解决方案,现在看起来很明显。 【参考方案1】:

由于我使用的是 paginate() 而不是 get(),所以我认为我无法指定列。

但可以做到。

Paginate 允许定义列 - 它就在那里看着我。

这是对我有用的解决方案:

$列 = [ '_layout_side_menu_groups.created_at AS layout_created_at', '_layout_side_menu_groups.updated_at AS layout_updated_at', 'system_employees.created_at AS system_created_at', 'system_employees.updated_at AS system_updated_at', ]; $this->menuGroups ->leftJoin('system_employees', 'system_employees.id', '=', '_layout_side_menu_groups.system_employee_id') ->orderBy('_layout_side_menu_groups.' . $columnSorted, $sortOrder) ->分页($pages,$columns,$pageName,$page);

所有表中的所有列都可以这样定义。

【讨论】:

以上是关于加入belongsToMany并获取所有列的主要内容,如果未能解决你的问题,请参考以下文章

Bookshelf.js belongsToMany 查询列错误

如何在 Sequelize 中对 belongsToMany 关联进行***查询?

按 belongsToMany 关系字段过滤

Laravel Eloquent:违反完整性约束:1052 列“id”在 where 子句不明确

Hive 加入不同的

在 sequelize.js 中获取与 belongsToMany 的关联