繁体   English   中英

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

[英]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个实体的结果: directorteacherstudent ,所有这三个实体都具有关联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');

数据库和OOP设计

(这是您应该如何做的)

为什么要在单独的表中放置它们? 大多数情况下,不良设计通常都会将其标准化。 如果两个对象具有相同的字段/成员,则它们是同一种类的对象。

如果对象具有相同的字段,则它们应该是相同的对象种类,并且应该为要获取的对象类型添加一个标志。 因此,与其使用三个表

  • ID
  • 用户身份
  • 描述
  • Updated_at
  • created_at

您将在一个表中包含以下字段:

  • ID
  • 用户身份
  • 描述
  • 类型
  • Updated_at
  • created_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM