Coo*_*ola 6 many-to-many polymorphic-associations laravel eloquent
简而言之,它由几个多对多的多态关系组成,如下所示:
许多resources
可以有许多sources
,并且数据透视表sourceables
包含使数据透视表中的每一行唯一的信息catalog_number
。lot_number
许多资源也可能来自相同来源或不同来源,通过数据透视表上的目录号和批号来区分。
许多resources
也可以有许多publications
附加到它,通过publicationables
表与notes
枢轴表
许多出版物也可以描述资源的来源。
我的问题:
sourceables
我应该如何保存数据透视表行之间的sourceables
关系publications
?sourceables
来链接到吗publications
?这是我的回答,希望能为您的问题带来一些启发。我已经发布了一个GitHub 存储库,其中包含我在此处编写的所有代码的示例。我添加了有关如何在那里复制我的场景的更多信息。
\n这是我对数据库及其关系的解释。您可以检查存储库中的所有迁移。\n
我应该如何保存可来源到出版物的枢轴行之间的关系?
\n在继续代码示例之前,我想解释一些需要理解的重要概念。我将使用表达式标签来引用用于关联模型的标识符或索引变形关系。\n其工作方式是通过将标签分配给要添加到关系中的任何模型。使用这些标签的任何模型都可以存储在 Morph Pivot Table 中。Laravel 使用 _"modelable"类型列来过滤对存储模型名称的关系的调用。您可以使用关系“标记”您的模型,在模型中创建一个返回 morphToMany 关系函数的方法。
\n对于这种特定情况,操作方法如下:\n在资源模型中,您有两种方法,一种与 可来源索引相关,另一种与使用morphToMany作为返回的可发布标记相关。\n以下是其操作方法\看看资源模型(./app/Models/Resource.php):
\n<?php\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Resource extends Model\n{\n use HasFactory;\n protected $guarded = [];\n\n public function publications()\n {\n return $this->morphToMany(Publication::class, \'publicationable\')->withPivot(\'notes\');\n }\n\n public function sources()\n {\n return $this->morphToMany(Source::class, \'sourceable\')->withPivot([\'catalog_number\', \'lot_number\']);\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n在您的发布模型中,您有两种方法,一种与 可来源索引相关,另一种与资源方法与使用morphedByMany作为回报的可发布标签的逆关系有关。\n这是发布模型的外观 (./应用程序/模型/Publication.php):
\n<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Publication extends Model\n{\n use HasFactory;\n protected $guarded = [];\n\n public function sources()\n {\n return $this->morphToMany(Source::class, \'sourceable\')->withPivot([\'catalog_number\', \'lot_number\']);\n }\n\n public function resources()\n {\n return $this->morphedByMany(Resource::class, \'publicationable\');\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\nWith this, you can be able to accomplish your goal of relating Publications with Resources and Sources.\n
Run Code Online (Sandbox Code Playgroud)\n不,你不需要。您可以使用sourceables表来完成此操作。您始终可以通过创建返回与源模型的morphToMany关系的方法来将源与任何模型相关联。这些是我们对问题 1 的出版物所做的。
\n我认为 Eloquent 是整个 Laravel 框架中我最喜欢的功能。这是我们在模型定义上所做的一切的锦上添花。
\n如果您再次检查资源和发布模型定义,我们将添加一个withPivot()方法,其中包含我们想要包含在对 eloquent 关系进行的任何调用中的相关字段。此方法可以从数据透视表中读取自定义值。
\n重要提示:对于此示例,我隐式添加了主元值,因为我没有在迁移时将这些列声明为 NULL。
\n要使用关系将发布与资源关联(存储在数据透视表上),您只需:
\nWith this, you can be able to accomplish your goal of relating Publications with Resources and Sources.\n
Run Code Online (Sandbox Code Playgroud)\nPsy Shell v0.10.8 (PHP 8.0.6 \xe2\x80\x94 CLI) by Justin Hileman\n>>> $publication = \\App\\Models\\Publication::find(5)\n>>> $resource = \\App\\Models\\Resource::find(19)\n>>> $resource->publications()->attach($publication, ["notes" => "Eureka!"]);\n### Adding another Publication\n>>> $publication = \\App\\Models\\Publication::find(10)\n>>> $resource->publications()->attach($publication, ["notes" => "Eureka 2!"]);\n
Run Code Online (Sandbox Code Playgroud)\n要从资源中检索所有出版物,您只需:
\nuse App\\Models\\Resource;\nuse App\\Models\\Publication;\n...\n$id_resource = 1; // This is the Resource Id you want to reach.\n$id_publication = 10; // This is the Resource Id you want to reach.\n\n$resource = Resource::find($id_resource);\n$publication = Publication::find($id_publication);\n$pivotData = [ "notes" => "Eureka!" ];\n\n$resource->publications()->attach($publication, $pivotData);\n
Run Code Online (Sandbox Code Playgroud)\n容易吧?:) 雄辩的力量!
\nPsy Shell v0.10.8 (PHP 8.0.6 \xe2\x80\x94 CLI) by Justin Hileman\n>>> $resource = \\App\\Models\\Publication::find(5)\n>>> $resource->publications()->get();\n
Run Code Online (Sandbox Code Playgroud)\n以防万一,您可以通过以下方式存储和检索所有模型:
\nuse App\\Models\\Publication;\nuse App\\Models\\Resource;\nuse App\\Models\\Source;\n...\n... Method ...\n$id_publication = 1;\n$id_resource = 1;\n$id_source = 1;\n\n$publication = Publication::find($id_resource);\n$resource = Resource::find($id_resource);\n$source = Source::find($id_resource);\n\n$publicationPivotColumns = [\n "notes" => "This is a note...",\n];\n\n$sourcePivotColumns = [\n "catalog_number" => 100,\n "lot_number" => 4903,\n];\n\n// Storing Data\n// Attach (Store in the publicationables table) a Publication to a Resource\n$resource->publications()->attach($publication, $publicationPivotColumns);\n\n// Attach (Store in the sourceables table) a Source to a Resource\n$resource->sources()->attach($source, $sourcePivotColumns);\n\n// Attach (Store in the sourceables table) a Source to a Publication\n$publication->sources()->attach($source, $sourcePivotColumns);\n\n// Retraiving Data\n// Get all Sources from a Resource\n$resource->sources()->get();\n\n// Get all Publications from a Resource\n$resource->publications()->get();\n\n// Get all Sources from a Publication\n$publication->sources()->get();\n
Run Code Online (Sandbox Code Playgroud)\n