首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何创建一个雄辩的多态关系

我如何创建一个雄辩的多态关系
EN

Stack Overflow用户
提问于 2021-05-09 15:17:57
回答 1查看 440关注 0票数 1

我有两个雄辩的模型模型用户和零售商。我想要创建一个新的模型“任务”,其中应该有一个字段"added_by“,可以表示用户或零售商。

我如何为Task创建迁移,以便有一个字段可以表示用户或零售商?

代码语言:javascript
运行
复制
Schema::create('tasks', function (Blueprint $table) {
   $table->id();
   $table->unsignedBigInteger('product_id');
   $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
   $table->morphes('added_by');
   $table->timestamps();
});

例如,如何创建引用用户的任务?

代码语言:javascript
运行
复制
Task::create([
'product_id' => 1,
'added_by' => ????
]);

同样,当我得到一个雄辩的任务实例时,我如何知道added_by是在引用用户还是零售商呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-09 15:44:40

迁移的语法是$table->morphs(...),而不是$table->morphes(...)

$table->morphs('added_by')将创建added_by_idadded_by_type

备选案文1: 1-M多态关系

您需要在UserRetailerTask模型中定义一些关系

User

代码语言:javascript
运行
复制
class User extends Authenticable
{
    public function tasks()
    {
        return $this->morphMany(Task::class, 'added_by');
    }
}

Retailer

代码语言:javascript
运行
复制
class Retailer extends Model
{
    public function tasks()
    {
        return $this->morphMany(Task::class, 'added_by');
    }
}

Task

代码语言:javascript
运行
复制
class Task extends Model
{
    protected $fillable = ['product_id'];
    
    public function added_by()
    {
        return $this->morphTo();
    }
}

雄辩的关系-一对多多态关系

若要为UserRetailer添加一个Retailer,请使用relationship方法。

代码语言:javascript
运行
复制
$user->tasks()->create(['product_id' => $productId]);

$retailer->tasks()->create(['product_id' => $productId]);

雄辩的关系-插入和更新相关模型

选项2: M多态关系

另一种选择是在ProductUserRetailer之间使用多到多的多态关系

您需要在UserRetailerProduct节点中定义一些关系。

User

代码语言:javascript
运行
复制
class User extends Authenticable
{
    // Optional
    public function tasks()
    {
        return $this->morphMany(Task::class, 'added_by');
    }

    public function products()
    {
        return $this->morphToMany(Product::class, 'added_by', 'tasks')
                    ->using(Task::class)
                    ->withTimestamps();
    }
}

Retailer

代码语言:javascript
运行
复制
class Retailer extends Model
{
    // Optional
    public function tasks()
    {
        return $this->morphMany(Task::class, 'added_by');
    }

    public function products()
    {
        return $this->morphToMany(Product::class, 'added_by', 'tasks')
                    ->using(Task::class)
                    ->withTimestamps();
    }
}

Product

代码语言:javascript
运行
复制
class Product extends Model
{
    // Optional
    public function tasks()
    {
        return $this->hasMany(Task::class, 'product_id');
    }

    public function users()
    {
        return $this->morphedByMany(User::class, 'added_by', 'tasks')
                    ->using(Task::class)
                    ->withTimestamps();
    }
}

Task

代码语言:javascript
运行
复制
use Illuminate\Database\Eloquent\Relations\MorphPivot;

class Task extends MorphPivot
{
    public $incrementing = true;

    // Optional
    public function added_by()
    {
        return $this->morphTo();
    }

    // Optional
    public function product()
    {
        return $this->belongsTo(Product::class, 'product_id');
    }
}

雄辩的关系-多到多多态关系

UserRetailerProduct相关联(使用Task作为变形枢轴)

代码语言:javascript
运行
复制
$user->products()->attach($productId);

$retailer->products()->attach($productId);

雄辩的关系-将许多关系更新到多个关系

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67459313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档