Laravel 多态多对多关系数据透视表与另一个模型的关系

2024-02-14

I have the following table structure as shown in the diagram: database diagram

简而言之,它由几个多对多的多态关系组成,如下所示:

  • many resources可以有很多sources和数据透视表sourceables包含catalog_number and lot_number使数据透视表中的每一行都唯一的信息。许多资源也可能来自相同来源或不同来源,通过数据透视表上的目录号和批号来区分。

  • many resources还可以有很多publications附加到它,通过publicationables表与notes在数据透视表上

  • 许多出版物也可以描述资源的来源。

我的问题:

  1. 由于资源的来源是通过数据透视表区分的sourceables我应该如何保存数据透视表行之间的关系sourceables to the publications?
  2. 你可以在两者之间有一个自定义的中间表模型吗sourceables和“出版物”链接到publications?
  3. 如何检索资源及其所有出版物以及所有相应出版物的来源?

这是我的回答,希望能为您的问题带来一些启发。我已经发布了一个GitHub 存储库 https://github.com/ricardov03/polyrelations以及我在这里编写的所有代码的示例。我添加了有关如何在那里复制我的场景的更多信息。

数据库和关系

Here is my interpretation of the Database and its relations. You can check all the Migrations on the repository. image

解决方案

问题一:

我应该如何保存可来源到出版物的枢轴行之间的关系?

Answer:

在继续代码示例之前,我想解释一些需要理解的重要概念。我将使用这个表达tag参考标识符 or index变形关系用于关联模型。 其工作方式是将标签分配给您想要添加到关系中的任何模型。使用这些标签的任何模型都可以存储在 Morph Pivot Table 中。 Laravel 使用 _"modelable"type列来过滤对存储模型名称的关系的调用。您可以使用关系“标记”您的模型,在模型中创建一个返回 morphToMany 关系函数的方法。

对于这种特定情况,请执行以下操作: 在您的资源模型中,您有两种方法,一种与可来源的索引和另一个可出版的标签使用变形对多作为回报。 资源模型 (./app/Models/Resource.php) 的外观如下:

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Resource extends Model
{
    use HasFactory;
    protected $guarded = [];

    public function publications()
    {
        return $this->morphToMany(Publication::class, 'publicationable')->withPivot('notes');
    }

    public function sources()
    {
        return $this->morphToMany(Source::class, 'sourceable')->withPivot(['catalog_number', 'lot_number']);
    }
}

在您的发布模型中,您有两种方法,一种与可来源的索引和另一个逆关系使用资源方法可出版的标签使用由许多变形作为回报。 发布模型 (./app/Models/Publication.php) 的外观如下:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Publication extends Model
{
    use HasFactory;
    protected $guarded = [];

    public function sources()
    {
        return $this->morphToMany(Source::class, 'sourceable')->withPivot(['catalog_number', 'lot_number']);
    }

    public function resources()
    {
        return $this->morphedByMany(Resource::class, 'publicationable');
    }
}
With this, you can be able to accomplish your goal of relating Publications with Resources and Sources.

问题2:两者之间可以有一个中间表吗可来源的 and 可出版的链接到出版物?

Answer:

不,你不需要。您可以使用来源表来完成此操作。您始终可以通过创建返回源的方法将源与任何模型相关联变形对多与源模型的关系。这些是我们对出版物所做的问题1.

问题3:如何检索资源及其所有出版物以及所有相应出版物的来源?

Answer:

我认为 Eloquent 是整个 Laravel 框架中我最喜欢的功能。这是我们在模型定义上所做的一切的锦上添花。

如果您再次检查资源和发布模型定义,我们会添加一个withPivot()我们希望在对 eloquent 关系进行的任何调用中包含相关字段的方法。此方法可以从数据透视表中读取自定义值。

重要提示:对于此示例,我隐式添加了主元值,因为我在迁移时没有将这些列声明为 NULL。

要使用关系将发布与资源关联(存储在数据透视表上),您只需:

(Using 工匠修补匠)
Psy Shell v0.10.8 (PHP 8.0.6 — CLI) by Justin Hileman
>>> $publication = \App\Models\Publication::find(5)
>>> $resource = \App\Models\Resource::find(19)
>>> $resource->publications()->attach($publication, ["notes" => "Eureka!"]);
### Adding another Publication
>>> $publication = \App\Models\Publication::find(10)
>>> $resource->publications()->attach($publication, ["notes" => "Eureka 2!"]);
(使用控制器)
use App\Models\Resource;
use App\Models\Publication;
...
$id_resource = 1; // This is the Resource Id you want to reach.
$id_publication = 10; // This is the Resource Id you want to reach.

$resource = Resource::find($id_resource);
$publication = Publication::find($id_publication);
$pivotData = [ "notes" => "Eureka!" ];

$resource->publications()->attach($publication, $pivotData);

要从资源中检索所有出版物,您只需:

(Using 工匠修补匠)
Psy Shell v0.10.8 (PHP 8.0.6 — CLI) by Justin Hileman
>>> $resource = \App\Models\Publication::find(5)
>>> $resource->publications()->get();

容易吧? :) 雄辩的力量!

(使用控制器)
use App\Models\Resource;
...
$id_resource = 1; // This is the Resource Id you want to reach.
$resource = Resource::find($id_resource);

$resource->publications()->get();

以防万一,您可以通过以下方式存储和检索所有模型:

(使用控制器)
use App\Models\Publication;
use App\Models\Resource;
use App\Models\Source;
...
... Method ...
$id_publication = 1;
$id_resource = 1;
$id_source = 1;

$publication = Publication::find($id_resource);
$resource = Resource::find($id_resource);
$source = Source::find($id_resource);

$publicationPivotColumns = [
    "notes" => "This is a note...",
];

$sourcePivotColumns = [
    "catalog_number" => 100,
    "lot_number" => 4903,
];

// Storing Data
// Attach (Store in the publicationables table) a Publication to a Resource
$resource->publications()->attach($publication, $publicationPivotColumns);

// Attach (Store in the sourceables table) a Source to a Resource
$resource->sources()->attach($source, $sourcePivotColumns);

// Attach (Store in the sourceables table) a Source to a Publication
$publication->sources()->attach($source, $sourcePivotColumns);

// Retraiving Data
// Get all Sources from a Resource
$resource->sources()->get();

// Get all Publications from a Resource
$resource->publications()->get();

// Get all Sources from a Publication
$publication->sources()->get();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 多态多对多关系数据透视表与另一个模型的关系 的相关文章

随机推荐

  • 在 SQL Server 中删除具有默认约束的列(IF EXISTS)

    我正在编写一个用于删除列和默认约束的 SQL 脚本 以下脚本工作正常 但我想知道这是否是正确的方法 我可以在一个语句中删除带有列的默认约束 而不是使用两个单独的约束吗 IF EXISTS SELECT FROM dbo sysobjects
  • 将 NSUserDefaults 转换为钥匙串?

    所以 NSUserDefaults 非常容易使用 但显然 它不太安全 没有加密 当然 客户希望应用程序首选项是安全的 因为它包含敏感数据 但钥匙串是安全的 尽管很难编码 显然 那么有没有一种方法可以轻松地将 NSUserDefaults 代
  • tslint 更新错误“找不到模块 'tslint/lib/lint'”

    我们最近将 Angular 2 项目升级为 angular cli1 0版本 我们还升级了tslint from 2 x to 5 x 现在我们收到以下信息tslint设计时出错 在 VSCode 输出终端中 验证时找不到模块 tslint
  • 无法将 django 模型导入到 celery 任务中

    我有以下任务 from future import absolute import from myproject celery import app from myapp models import Entity app task def
  • vue 3打字稿未捕获(承诺中)TypeError:this.$on不是一个函数

    我安装了一个新的 Vue 3 其中包含 vue cli 和 typescript 一切都在运行 但是当我添加一个https vue select org https vue select org 包裹 我在浏览器控制台上收到此错误 Unca
  • 如何在 Node.js 中等待异步请求循环完成?

    我想在 node js 中发出多个请求来获取几个外部 API 响应 并将它们合并到一个数组中 我正在使用 for 循环来实现此目的 这是我的代码 res setHeader Content Type application json con
  • 如何在 Angular 2 中打印 PDF

    我有 pdf 文件的 URL exa url 是 test example com incoice 1 download auth token some token 当我访问此 url 时 该 url 将在浏览器中显示 PDF 现在我想用打
  • 如何使用 Bresenham 创建任意粗细的线?

    我目前正在使用 Bresenham 的算法来绘制线条 但它们的厚度 当然 是一个像素 我的问题是绘制任意粗细的线条最有效的方法是什么 我使用的语言是C 再取一个 Bresenham 循环 并用它来修改原始线在矩形方向上的起始和结束位置 问题
  • 如何提高 Java 中收据打印机和 ESC/POS 命令的速度

    我有一个用 Java 与热敏打印机通信的应用程序 使热敏打印机使用 Star tsp 100 打印机打印带有条形码 强调 不同尺寸等的收据 我可以让程序打印出我喜欢的内容 但是打印机速度很慢 我相信原因是我使用了非首选的方式 方法发送字节命
  • 在 ASP.Net MVC 中管理 MongoDB 连接的正确方法是什么?

    管理 MongoServer 类生命周期的最佳实践是什么 我应该创建一个并在每个请求结束时关闭它 还是应该使用 StructureMap 之类的东西在应用程序的整个生命周期中将其保留为单例 任何帮助都是值得赞赏的 In 官方文档 http
  • 如何对行组上的 SSRS 矩阵列求和

    我有一份报告 显示一个人为他们分配到的每个项目工作的总小时数 按月汇总 我想在 SSRS 2008 R2 中计算每个人每个月的总小时数 因此 例如 我有以下数据 并希望像这样列出总计 January February March Worke
  • 为什么在预提交挂钩中执行 git add 后索引没有更新?

    我有一个预提交钩子 检查我的版本文件是否需要更新 修改所述文件 对此文件执行 git add 这允许我将更新的版本文件添加到同一提交中 我遇到的唯一问题是 在钩子运行后 工作树和 HEAD 会使用新版本文件进行更新 但索引不会 我需要手动暂
  • Firebase 推送通知在某些设备上无法正常工作

    对于推送通知 我使用 FCM 我在 VIVO V3 手机中遇到一些问题 相同的代码适用于其他设备 黑莓 华为 三星 适用于以下所有场景我已经测试了 3 个场景 当应用程序位于前台时 当应用程序处于后台时 当应用程序完全杀死时 前 2 个条件
  • ConsoleAppender 实例化不起作用:具有私有访问权限

    我的 ConsoleAppender 类实例化不起作用 import org apache logging log4j core appender ConsoleAppender public class Application priva
  • 如何在 PHP 中将 PDF 版本 1.5 转换为版本 1.4

    如何在 PHP 中将 PDF 版本 1 5 转换为版本 1 4 有人能指出我正确的方向吗 我有类似的需求 发现Ghostscript可以修改PDF版本 文档在这里 http ghostscript com doc current Use h
  • 如何使用setCamera(MediaRecorder)?

    根据Android SDK MediaRecorder setCamera可以用于回收现有的相机实例进行视频捕获和预览 而无需重置预览 我无法找到任何示例 并且我所有的尝试都是徒劳的 我要么得到错误的状态异常 要么 MediaRecorde
  • 从 ASP.NET 应用程序写入 IIS 日志

    我想让我的 ASP NET 应用程序将行写入日志中的某个位置 IIS 是否提供任何内置方式来记录 ASP NET 日志消息 我在想可能有一种方法可以捕获对 System Diagnostics Debug WriteLine 的调用 但我找
  • SQLite 外部查询返回内部查询中找不到的结果

    我只是想知道是否有人遇到过 SQLite 3 7 4 中的情况 其中查询将返回一组结果 而当它成为子查询时 结果完全不同 我在更复杂的查询中发现了问题 但这里有一个更简单的示例 演示了相同的行为 数据库设置 CREATE TABLE tes
  • 如何使用 Paramiko 从 SFTP 服务器仅下载最新文件?

    我想编写连接到我的大学 SFTP 服务器并下载最新文件和练习的脚本 到目前为止 我已经对 Paramiko 示例中的代码进行了一些更改 但我不知道如何下载最新的文件 这是我的代码 import functools import parami
  • Laravel 多态多对多关系数据透视表与另一个模型的关系

    I have the following table structure as shown in the diagram 简而言之 它由几个多对多的多态关系组成 如下所示 many resources可以有很多sources和数据透视表so