当前位置: 首页 > 知识库问答 >
问题:

如何结合/合并三个具有精确模式但数据不同的数据库表,同时处理有说服力的关系?

上官季
2023-03-14

在我的Laravel应用程序中,我有三个结构/模式完全相同的数据库表,然后有一个包含所有用户的“用户”表。

所有三个表都具有以下结构。。。

表1
id

表2
id

表3
id

现在我真的想把数据保存在这些单独的表中。但是,有一次我需要在同一个视图中显示这三个表中的所有条目,最好是orderedBycreated_at字段。

我使用以下代码来合并这些表:

   $table2 = DB::table('table2');
   $table3 = DB::table('table3');
   $query = DB::table('table1')
        ->union($table1)
        ->union($table3)
        ->get();

出现的问题是雄辩的关系不起作用,Blade中的这一语句中断了。{{$评论-

我只想能够联合/合并所有这三个表,最好能够有关系或找到其他方法,这样我就可以得到在联合/合并结果中拥有特定条目的用户的名称。并且还具有联合/合并结果orderedBycreated_at列。

任何帮助都将不胜感激。

谢啦


共有2个答案

奚无尘
2023-03-14

假设要合并3个实体的结果:主管教师学生,这三个实体都有关系角色

您可以先加载关系,然后使用其中一个方法合并集合:

$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
牛智志
2023-03-14

(以下是如何按照您的方式操作)

收藏中的它。在这里,我渴望加载用户,但你不必这样做。不过,这将大大提高性能。请注意,这是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');

(以下是你应该怎么做)

你为什么要把它们放在不同的桌子上?大多数人普遍认为,不规范化是非常糟糕的设计。如果两个对象具有相同的字段/成员,则它们是相同类型的对象。

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

  • id

您将有一个包含以下字段的表:

  • id

确保在类型上放置一个索引,这样将它们都放在同一个表中不会影响性能。然后按创建的位置对它们进行排序(注意一个查询,一个联接):

$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');

如果一个(或多个)对象的“类型”有新字段,那么您就开始继承

 类似资料:
  • 问题内容: 我有两个表(表A和表B)。 它们具有不同的列数-假设表A具有更多列。 如何合并这两个表,并为表B没有的列获取空值? 问题答案: 为具有较少列的表添加额外的列作为null

  • 问题内容: 我肯定在这里错过了一些简单的事情。尝试在熊猫中合并具有相同列名的两个数据框,但右侧的数据框具有一些左侧没有的列,反之亦然。 我试着加入外部联接: 但这产生了: 我还指定了一个要连接的单列(例如on =“ id”),但是它复制了除“ id”以外的所有列,例如attr_1_x,attr_1_y,这并不理想。我也将整个列列表(有很多)传递给了“ on”: 产生: 我想念什么?我想获得一个带有

  • 问题内容: 我有以下数据集。 https://drive.google.com/drive/folders/1NRelNsXQJ7MTNKcm-T69N6r5ZsOyFmTS?usp=sharing 如果列名称与工作表名称相同,则将所有内容合并在一起作为单独的列,以下是代码 运行以上代码后的数据 merged_data 如何合并条件文件? 健康)状况。 以上代码段中的价格1指向带有名称为int 7

  • 我肯定错过了一些简单的东西。尝试合并熊猫中的两个数据帧,它们的列名基本相同,但右边的数据帧有一些左边没有的列,反之亦然。 我已尝试使用外部联接进行联接: 但这会产生: 我还指定了一个要连接的列(例如,on="id"),但这会重复所有列,除了"id",如attr_1_x、attr_1_y,这并不理想。我还传递了整个列列表(有很多)到on: 其产生: 我错过了什么?我想得到一个附加了所有行的df,并且

  • 问题内容: 好的,这是我的难题,我建立了一个数据库,其中包含约5个表,所有表的数据结构完全相同。出于本地化的目的,以这种方式分离了数据,并总共分割了约450万条记录。 在大多数情况下,只需要一张桌子就可以了。但是,有时需要两个或多个表中的数据,并且需要按用户定义的列对数据进行排序。这就是我遇到的问题。 数据列: MySQL陈述: MySQL吐出这个错误: 显然,我做错了。有人愿意为我阐明一下吗?

  • 我正在使用的数据库有许多具有相同列但(显然)具有不同表名的表(不是我设计的)。例如(这些是数据库表名): 有没有可能用JPA和Hibernate将这些映射到一个Java类实体?类的名称是,然后在使用它时传入例如,以便对象使用表? 还是只使用普通的、普通的Java对象来完成这样的任务更好? 谢谢你!