为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
largeQ 2021-04-28 21:41:56
在我的Laravel应用程序中,我有三个具有完全相同的结构/架构的数据库表,然后有一个包含所有用户的“用户”表。这三个表都具有以下结构...table1id用户ID描述Updated_at created_at1 1这很好xxxxxxxxxx xxxxxxxxx2 2是的,它是xxxxxxxxxx xxxxxxxxxtable2id user_id说明updated_at created_at1 3另一个文本xxxxxxxxxx xxxxxxxxx2 4还有更多xxxxxxxxxx xxxxxxxxxtable3id user_id描述updated_at created_at1 5更漂亮的xxxxxxxxxx xxxxxxxxx2 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列。任何帮助将不胜感激。
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

级联

(这是按照您的方式做的方法)


在收藏中。在这里,我渴望加载用户,但是您不必这样做。不过,它将大大提高性能。请注意,由于您的设计选择,这是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

确保把一indextype,所以没有性能损失,以坚持他们都在同一个表。然后将它们全部按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');

如果对象的“类型”中的一个(或多个)具有新字段,那么您将沿着继承的道路开始。


查看完整回答
反对 回复 2021-05-14
?
郎朗坤

TA贡献1921条经验 获得超9个赞

让我们假设你要合并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():


return view('my_view', compact('users'));

然后,您将一个关联数组传递给视图,因此,为了访问关系中的值,您需要执行以下操作:


@foreach ($users as $user)

    <h1> {{ $user['role']['name'] }} </h1>

@endforeach


查看完整回答
反对 回复 2021-05-14
  • 2 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信