我在Laravel 面临着一个关于口才关系的复杂问题.如果你能提供任何帮助,我将不胜感激.

以下是我的表格 struct :

表:

  • albums:id,name
  • photos:id,name
  • layouts:id,name
  • album_photo:album_id,photo_id
  • album_photo_layout:album_idphoto_idlayout_idvisibility

关系:

  • 相册可以具有多张照片(具有数据透视表album_photoalbumsphotos之间的多对多关系).
  • 一张照片可以属于多个相册.
  • 每个相册中的每张照片可以具有具有唯一可见性设置的多个布局(具有数据透视表album_photo_layoutalbumsphotoslayouts之间的三向多对多关系).

我正在努力实现的是获得所有相册,每个相册中的所有照片,以及每张照片的所有可能布局.如果某个布局没有链接到特定相册的照片,我希望添加一个默认的可见度值.

以下是我目前的做法:

$album->load([
    'photos.layouts' => fn($query) => $query->where('album_id', $album->id)
]);

但这不包括没有与特定相册的照片链接的布局.这些缺失的布局应该包含在默认的visibility值中.

我已经try 在参考资料中使用whenLoaded()来解决这个问题,但没有成功.如果缺少布局,它将返回null,并且不符合我的要求.

理想情况下,我希望解决方案遵循Eloquent 的ORM原则,而不是求助于原始的SQL查询.

推荐答案

你可能想把事情改得更好一些.

Album:
- id
- name
- hasMany(AlbumPhoto)
Photo:
- id
- name
- hasMany(AlbumPhoto)
Layout
- id
- name
- hasMany(AlbumPhotoLayout)
AlbumPhoto
- id
- belongsTo(Photo)
- belongsTo(Album)
- hasMany(AlbumPhotoLayout)
AlbumPhotoLayout
- id
- belongsTo(AlbumPhoto)
- belongsTo(Layout)

你要找的是Album::with('albumPhoto.albumPhotoLayout');

我发现,在许多情况下,将枢轴建模为模型是有用的.此外,你还可以通过定义Pivot classes来找到一个中间立场.实际上,AlbumPhotoAlbumPhotoLayouts可以扩展为Pivot而不是Model.

Php相关问答推荐

为什么PHP输出\n而不是实际创建一个新元素?

如何在Livewire中验证多个 Select 字段

允许Laravel路由指定`withTrashed`,尽管有显式的模型绑定

在Laravel Eloquent中实现一对多关系

根据产品类型显示或隐藏WooCommerce管理产品自定义字段

将部分产品排除在WooCommerce的计算附加费之外

如何不重新查询模型A-&>;相关模型B-&>模型

如何使用索引加速和优化MySQL搜索

使用HPOS过滤WooCommerce中的订单列表

添加不存在的订单元数据以扩展WooCommerce管理订单搜索

在 PHP MySQL 中自动生成账单编号

根据小计向 WooCommerce Checkout 添加佣金

计算添加到购物车的点击次数并将其显示在 WooCommerce 管理产品列表中

使用 wp_footer 挂钩添加一些 CSS 不起作用

simplexml_load_file 和 simplexml_load_string 返回具有不同编码的相同数据

从插件更改主题功能,function_exists 不起作用

使用自定义规则进行 Livewire 验证不会显示错误

仅在管理员新订单通知中显示WooCommerce订单商品自定义元数据

$_SERVER 超全局变量在 PHP 中是否保证可写?

如何将在同一台服务器上运行的 2 个 PHP 应用程序与使用公共会话分开