Laravel MorphToMany 不适用于多列

Posted

技术标签:

【中文标题】Laravel MorphToMany 不适用于多列【英文标题】:Laravel MorphToMany Doesn't Work for multi columns 【发布时间】:2020-10-30 05:27:42 【问题描述】:

Laravel 版本:7.0 这是我的表。

Schema::create('model_email_form', function (Blueprint $table) 
    $table->id();
    $table->string('model_type');
    $table->unsignedBigInteger('model_id');
    $table->unsignedBigInteger('email_id');
    $table->unsignedBigInteger('form_id');
    $table->timestamps();
);

这是我的Service 模型。

public function forms()

    return $this->morphToMany(
        Form::class,
        'model',
        'model_email_form',
        'model_id',
        'form_id'
    );


public function emails()

    return $this->morphToMany(
        Email::class,
        'model',
        'model_email_form',
        'model_id',
        'email_id'
    );

我在model_email_form 表中插入了数据,但是当我得到service model 对象时,emailsforms 有空对象。

谁能帮帮我?

【问题讨论】:

MorphToMany 用于多态多对多。您提供的 model_email_form 表对此不正确。此外,请更详细地描述表单、电子邮件和服务之间的关系。是否有许多表单与更多模型相关而不是服务?同样,是否有许多电子邮件与更多模型相关而不是服务?您是否有理由希望将两个多态关系存储在同一个表中? 感谢您的回复。 Form、Email和Service之间的关系都是多对多的,我之所以把form_id和email_id放在一起是因为service需要两者。 它可以同时要求两者,并且不能将它们放在同一个表中。我会就我对什么是合适的解释做出回答,如果不合适,我会删除它 我只是将它们分成两个表。但是还是不行。 啊,我刚刚发现了问题。我的错。感谢您的帮助。 【参考方案1】:

根据您的问题和 cmets:

有表格、电子邮件和服务。表单可以与任意数量的不同类型的模型相关联。电子邮件可以与任意数量的不同类型的模型相关联。一个服务可以有多个表单,一个服务可以有多个电子邮件。

以此为基础,这将是我们的架构:

Schema::create('forms', function (Blueprint $table) 
    $table->bigIncrements('id');
    $table->string('name'); // as an example
    ...
    $table->timestamps();
);

Schema::create('formables', function (Blueprint $table) 
    $table->unsignedBigInteger('form_id'); // the id of the form
    $table->unsignedBigInteger('formable_id'); // the associated model's id
    $table->string('formable_type'); // The associated model's class name
);

Schema::create('emails', function (Blueprint $table) 
    $table->bigIncrements('id');
    $table->string('subject'); // as an example
    ...
    $table->timestamps();
);

Schema::create('emailables', function (Blueprint $table) 
    $table->unsignedBigInteger('email_id'); // the id of the email
    $table->unsignedBigInteger('emailable_id'); // the associated model's id
    $table->string('emailable_type'); // The associated model's class name
);

Schema::create('services', function (Blueprint $table) 
    $table->bigIncrements('id');
    $table->string('name'); // as an example
    ...
    $table->timestamps();
);

使用该架构,我们可以创建具有以下关系的以下模型:

class Form extends Model

    public function services()
    
        return $this->morphedByMany(Service::class, 'formable');
    
   
    // Add the other morphedByMany relationships of forms


class Email extends Model

    public function services()
    
        return $this->morphedByMany(Service::class, 'emailable');
    
   
    // Add the other morphedByMany relationships of emails


class Service extends Model

    public function forms()
    
        return $this->morphedToMany(Form::class, 'formable');
    
   
    public function emails()
    
        return $this->morphedToMany(Email::class, 'emailable');
    

【讨论】:

以上是关于Laravel MorphToMany 不适用于多列的主要内容,如果未能解决你的问题,请参考以下文章

Propel toJson 或 exportTo('JSON') 不适用于 Laravel

Laravel 4 模型事件不适用于 PHPUnit

Laravel 8速率限制器不适用于路线

yajra/laravel-datatables 搜索不适用于 laravel 5.7

yajra/laravel-datatables 搜索不适用于 laravel 5.4

Laravel Schedule withoutOverlapping() 不适用于 runInBackground()