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
确保把一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');
如果对象的“类型”中的一个(或多个)具有新字段,那么您将沿着继承的道路开始。
TA贡献1921条经验 获得超9个赞
让我们假设你要合并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():
return view('my_view', compact('users'));
然后,您将一个关联数组传递给视图,因此,为了访问关系中的值,您需要执行以下操作:
@foreach ($users as $user)
<h1> {{ $user['role']['name'] }} </h1>
@endforeach
- 2 回答
- 0 关注
- 174 浏览
添加回答
举报