![](/img/trans.png)
[英]Quick retrieve data from different tables using Laravel eloquent relationships
[英]How to Union/Merge three database tables with exact schema but different data while taking care of eloquent relationships?
在我的Laravel应用程序中,我有三个具有完全相同的结构/架构的数据库表,然后有一个包含所有用户的“用户”表。
这三个表都具有以下结构...
表格1
ID用户ID描述Updated_at created_at
1 1这很好xxxxxxxxxx xxxxxxxxx
2 2是的,它是xxxxxxxxxx xxxxxxxxx
表2
ID用户ID描述Updated_at created_at
1 3其他文字xxxxxxxxxx xxxxxxxxx
2 4还有更多xxxxxxxxxx xxxxxxxxx
表3
ID用户ID描述Updated_at created_at
1 5更多不错xxxxxxxxxx xxxxxxxxx
2 6好了xxxxxxxxxx xxxxxxxxx
现在,我真的想将数据保留在这些单独的表中。 但是,在一个奇怪的时刻,我需要在同一视图中显示这三个表中的所有这些条目,最好是orderedBy created_at字段。
我使用以下代码来合并这些表:
$table2 = DB::table('table2');
$table3 = DB::table('table3');
$query = DB::table('table1')
->union($table1)
->union($table3)
->get();
出现的问题是,雄辩的关系不起作用,并且Blade中的该语句中断了。 {{$comment->user->name}}
。
我只希望能够合并/合并所有这三个表,并且最好能够具有关系或找到其他方式,以便获得在合并/合并结果中拥有特定条目的用户的名称。 并且也有并/合并结果orderedBy created_at列。
任何帮助将不胜感激。
谢谢
假设您要合并3个实体的结果: director
, teacher
, student
,所有这三个实体都具有关联role
:
$directors = Director::with('role')->get();
$teachers = Teacher::with('role')->get();
$students = Student::with('role')->get();
$users = $directors
->merge($teachers)
->merge($students);
然后,您可以访问该关系:
dd($users->first()->role->name);
如果使用compact
方法而不是with()
将这些值返回到视图,请记住以下compact
:
return view('my_view', compact('users'));
然后,您将一个关联数组传递给视图,因此,为了访问关系中的值,您需要执行以下操作:
@foreach ($users as $user)
<h1> {{ $user['role']['name'] }} </h1>
@endforeach
(这是按照您的方式做的方法)
在收藏中。 在这里,我渴望加载用户,但是您不必这样做。 但是它将大大改善性能。 请注意,由于您的设计选择,这是3个不同的查询,每个查询都执行一个联接。
$table1 = Table1::with('user')->all();
$table2 = Table2::with('user')->all();
$table3 = Table3::with('user')->all();
$tables = $table1->merge($table2)->merge($table3);
$tables = $tables->sortBy('create_at');
(这是您应该如何做的)
为什么要在单独的表中放置它们? 大多数情况下,不良设计通常都会将其标准化。 如果两个对象具有相同的字段/成员,则它们是同一种类的对象。
如果对象具有相同的字段,则它们应该是相同的对象种类,并且应该为要获取的对象类型添加一个标志。 因此,与其使用三个表
您将在一个表中包含以下字段:
确保在type
上放置一个index
,以便将它们全部粘贴到同一表中不会对性能造成任何影响 。 然后将它们全部按created_at排序(注意一个查询,一个连接):
$tables = Table::->orderBy('created_at')->with('user')->get();
要突破:
$table1 = Table::where('type','=',1)->with('user')->get();
$table2 = Table::where('type','=',2)->with('user')->get();
$table3 = Table::where('type','=',3)->with('user')->get();
为了使它们全部分解,请执行以下操作:
$tables = Table::->orderBy('created_at')->with('user')->get()->groupBy('type');
如果对象的“类型”中的一个(或多个)具有新字段,那么您将沿着继承的道路开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.