Laravel - 一个节目可以有多个提供者

时间:2016-12-24 00:31:28

标签: php sqlite laravel laravel-5

所以我试图找到解决方案但不确定如何做到这一点。我有一张桌子可以存储所有发生的节目。在给定的节目中,我可以让多个提供者参加该节目。提供商也可以参加许多节目。那么如何将其存储在数据库中并建立雄辩的关系呢?

显示架构

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")

1 个答案:

答案 0 :(得分:2)

创建provider_show迁移,该迁移将充当您的数据透视表。 该表将包含provider_idshow_id,它们将提供这些实体之间的多对多关系。

然后,在Provider模型上,您可以提供shows()方法,该方法会返回BelongsToMany关系。

// In your Provider model
public function shows()
{
    return $this->belongsToMany('App\Show');
}

请注意,Laravel默认根据两个关系按字母顺序查找数据透视表名称。

您还可以通过提供同时返回BelongsToMany关系的Show方法在providers()模型上添加反转。