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
对象时,emails
和forms
有空对象。
谁能帮帮我?
【问题讨论】:
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
yajra/laravel-datatables 搜索不适用于 laravel 5.7
yajra/laravel-datatables 搜索不适用于 laravel 5.4
Laravel Schedule withoutOverlapping() 不适用于 runInBackground()