pillar-science / laravel-multi-morph
该包已被弃用且不再维护。未建议替代包。
允许使用与同一模型相同的多个 MorphBy 关系
v0.2
2021-01-31 20:35 UTC
Requires
- php: ^7.3.0
- illuminate/database: ^8.0
README
允许使用与同一模型相同的多个 MorphOne/MorphMany 关系
问题
当向同一模型添加多个 morph 关系时,Laravel 无法区分它们。在关联到 MyFile 的表中,我们将有
当一个模型与同一模型有多个 morph 关系时,在检索这些关系的详细信息时会出现问题。Laravel 只存储相关模型属于哪种模型类型(此处为 User)的信息。因此,在检索 profilePicture 或 resume 关系时,我们得到了两个文件相同的查询结果(假设它们存在)
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 提供了两个额外的关联 morphOneRelationship 和 morphManyRelationship,这些关联将在具有 morphToRelationship 的模型上添加一个额外的列以存储特定的关系信息
如何使用
您需要向 被 morphed 模型 添加一个列来存储存储的关系名称。
迁移
以下是对 被 morphed 模型 的示例迁移。
Schema::table('files', function (Blueprint $table) {
$table->string('resource_relationship')->after('resource_type')->nullable();
});
在 trait 中替换方法
我们需要导入 HasMorphByRelationships trait 并将其用于关系的 两侧(morphOneMany 和 morphTo)。您需要用 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');