pillar-science/laravel-multi-morph

该包已被弃用且不再维护。未建议替代包。

允许使用与同一模型相同的多个 MorphBy 关系

v0.2 2021-01-31 20:35 UTC

This package is auto-updated.

Last update: 2023-12-29 03:31:21 UTC


README

允许使用与同一模型相同的多个 MorphOne/MorphMany 关系

问题

当向同一模型添加多个 morph 关系时,Laravel 无法区分它们。在关联到 MyFile 的表中,我们将有

当一个模型与同一模型有多个 morph 关系时,在检索这些关系的详细信息时会出现问题。Laravel 只存储相关模型属于哪种模型类型(此处为 User)的信息。因此,在检索 profilePictureresume 关系时,我们得到了两个文件相同的查询结果(假设它们存在)

class User extends Model
{
    public function profilePicture()
    {
        return $this->morphOne(MyFile::class, 'resource');
    }
    
    public function resume()
    {
        return $this->morphOne(MyFile::class, 'resource');
    }
}
class MyFile extends Model
{
    public function resource()
    {
        return $this->morphTo();
    }
}

解决方案

laravel-morph-multiple 提供了两个额外的关联 morphOneRelationshipmorphManyRelationship,这些关联将在具有 morphToRelationship 的模型上添加一个额外的列以存储特定的关系信息

如何使用

您需要向 被 morphed 模型 添加一个列来存储存储的关系名称。

迁移

以下是对 被 morphed 模型 的示例迁移。

Schema::table('files', function (Blueprint $table) {
    $table->string('resource_relationship')->after('resource_type')->nullable();
});

在 trait 中替换方法

我们需要导入 HasMorphByRelationships trait 并将其用于关系的 两侧morphOneManymorphTo)。您需要用 trait 中的新关系替换现有关系

原始 替换为
morphOne morphOneRelationship
morphMany morphManyRelationship
morphTo morphToRelationship

代码示例

use PillarScience\LaravelMultiMorph\Eloquent\Concerns\HasMorphByRelationships;

/**
 * refered as MorphedOneMany Model
 */
class User extends Model
{
    use HasMorphByRelationships;

    public function profilePicture()
    {
        return $this->morphOneRelationship(MyFile::class, 'resource');
    }
    
    public function resume()
    {
        return $this->morphOneRelationship(MyFile::class, 'resource');
    }
}
use PillarScience\LaravelMultiMorph\Eloquent\Concerns\HasMorphByRelationships;

/**
 * refered as MorphedTo Model
 */
class MyFile extends Model
{
    use HasMorphByRelationships;

    public function resource()
    {
        return $this->morphTo();
    }
}

关联模型

// $user is a User model

$file = new MyFile();
$file->resource()->associate($user, 'resume');