簡體   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