如何在拥有雄辩的关系的同时合并/合并具有精确模式但不同数据的三个数据库表?

在我的Laravel应用程序中,我有三个具有完全相同的结构/架构的数据库表,然后有一个包含所有用户的“用户”表。


这三个表都具有以下结构...


table1

id用户ID描述Updated_at created_at

1 1这很好xxxxxxxxxx xxxxxxxxx

2 2是的,它是xxxxxxxxxx xxxxxxxxx


table2

id user_id说明updated_at created_at

1 3另一个文本xxxxxxxxxx xxxxxxxxx

2 4还有更多xxxxxxxxxx xxxxxxxxx


table3

id user_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列。


任何帮助将不胜感激。


largeQ
浏览 176回答 2
2回答

斯蒂芬大帝

级联(这是按照您的方式做的方法)在收藏中。在这里,我渴望加载用户,但是您不必这样做。不过,它将大大提高性能。请注意,由于您的设计选择,这是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');数据库和OOP设计(这是您应该如何做的)为什么要在单独的表中放置它们?大多数情况下,不良设计通常都会将其归一化。如果两个对象具有相同的字段/成员,则它们是同一种类的对象。如果对象具有相同的字段,则它们应该是相同的对象种类,并且应该为要获取的对象类型添加一个标志。因此,与其使用三个表ID用户身份描述Updated_atcreated_at您将在一个表中包含以下字段:ID用户身份描述类型Updated_atcreated_at确保把一index对type,所以没有性能损失,以坚持他们都在同一个表。然后将它们全部按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');如果对象的“类型”中的一个(或多个)具有新字段,那么您将沿着继承的道路开始。

郎朗坤

让我们假设你要合并3个实体的结果:director,teacher,student,这一切的三个实体有关系role:您可以先加载关系,然后使用它们的许多方法之一来合并集合:$directors = Director::with('role')->get();$teachers = Teacher::with('role')->get();$students = Student::with('role')->get();$users = $directors&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ->merge($teachers)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ->merge($students);然后,您可以访问该关系:dd($users->first()->role->name);观察如果使用compact方法(而不是)将这些值返回到视图,请记住以下几点with():return view('my_view', compact('users'));然后,您将一个关联数组传递给视图,因此,为了访问关系中的值,您需要执行以下操作:@foreach ($users as $user)&nbsp; &nbsp; <h1> {{ $user['role']['name'] }} </h1>@endforeach
打开App,查看更多内容
随时随地看视频慕课网APP