所以我试图找到解决方案但不确定如何做到这一点。我有一张桌子可以存储所有发生的节目。在给定的节目中,我可以让多个提供者参加该节目。提供商也可以参加许多节目。那么如何将其存储在数据库中并建立雄辩的关系呢?
显示架构
Schema::create('shows', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('number')->unsigned();
$table->dateTime('airDate');
$table->string('podcastUrl')->nullable();
$table->timestamps();
});
提供商架构
Schema::create('providers', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('shortName')->nullable();
$table->string('image')->nullable();
$table->string('social')->nullable();
$table->timestamps();
});
我会将provider_id存储在show schema中吗?
更新1
所以我为数据透视表创建了一个新的迁移
Schema::create('provider_show', function (Blueprint $table) {
$table->integer('provider_id')->unsigned()->index();
$table->foreign('provider_id')->references('id')->on('providers')->onDelete('cascade');
$table->integer('show_id')->unsigned()->index();
$table->foreign('show_id')->references('id')->on('shows')->onDelete('cascade');
$table->primary(['provider_id', 'show_id']);
});
然后在show模型中我创建了以下
public function providers()
{
return $this->belongsToMany(Provider::class);
}
现在,当我保存新节目时,我添加了一个多节选择来选择我想要的提供商
$show = new Show;
$show->name = $request->name;
$show->number = $request->number;
$show->airDate = $request->airDate;
$show->podcastUrl = $request->podcastUrl;
$show->providers()->attach($request->providerList);
$show->save();
Session::flash('message', "Created Successfully!");
return back();
然后当我保存时,我收到以下错误
SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: provider_show.show_id (SQL: insert into "provider_show" ("provider_id", "show_id") select 1 as "provider_id", as "show_id" union all select 2 as "provider_id", as "show_id")
答案 0 :(得分:2)
创建provider_show
迁移,该迁移将充当您的数据透视表。
该表将包含provider_id
和show_id
,它们将提供这些实体之间的多对多关系。
然后,在Provider
模型上,您可以提供shows()
方法,该方法会返回BelongsToMany
关系。
// In your Provider model
public function shows()
{
return $this->belongsToMany('App\Show');
}
请注意,Laravel默认根据两个关系按字母顺序查找数据透视表名称。
您还可以通过提供同时返回BelongsToMany关系的Show
方法在providers()
模型上添加反转。