![](/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.