拉拉维尔 |如何在关系中使用数据透视表

时间:2021-03-17 08:57:30

标签: php laravel eloquent

我有一个关于关系的问题。我有一个活动模型和控制器。我想我搜索了很多,我找到了一个附加的方法。但不知道如何使用它。

我有一个这样的活动表:

Schema::create('activities', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('title');
        $table->string('company_name');
        $table->string('price');
        $table->string('description');
        $table->timestamps();
    });

另一个表是activity_asset,如下所示:

Schema::create('activity_asset', function (Blueprint $table) {
        $table->foreignId('activity_id')->constrained();
        $table->string('image')->nullable();
        $table->string('video')->nullable();
        $table->timestamps();
    });

现在我不知道如何将这两个表联系起来。我想做什么? •

  1. 我有一个成型刀片。输入 标题、公司名称、价格、描述、视频输入、文件输入。 (http://prntscr.com/10nyfd1 )

  2. 当我创建一个新活动时(标题、公司名称、价格、描述) 我想添加到视频和图像 URL 以添加活动资产表 带有活动 ID。

简短摘要:当我创建一个新活动时,如何添加其他字段,将其添加到带有activity_id 的activity_asset 表中。

非常感谢。

3 个答案:

答案 0 :(得分:1)

试试这个

首先,创建一个活动。

$activity =  new Activity;
$activity->title = $request->title;
$activity->company_name = $request->company_name;
$activity->price = $request->price;
$activity->description = $request->description;
$activity->save();

foreach ($request->image as $key => $value) {
    $image[] = array(
        'activity_id'         => $activity->id,
        'image'             => $value,
    );
}
ActivityAsset::insert($image);

foreach ($request->video as $key => $value) {
    $video[] = array(
        'activity_id'         => $activity->id,
        'video'             => $value,
    );
}
ActivityAsset::insert($video);

答案 1 :(得分:0)

数据透视表用于多对多关系。但是对于您的情况,您有一对多的关系。而且不需要数据透视表。

多对多关系的典型例子是文章和标签。其中 1 篇文章可以有多个标签,而 1 个标签可以属于多篇文章。

但是您的示例是一对多关系。其中 1 个活动可以有多个活动资产,而 1 个活动资产可以有一个活动。在这种情况下,您不需要数据透视表。

答案 2 :(得分:0)

也许这对你有帮助

public function method()
{
    $activity = Activity::find(1);

    $asset = $activity->assets()->create([
       'image' => 'url',
       'video' => 'url',
    ]);
}

在您的活动模型中:

public function assets()
{
   return $this->hasMany('activity_asset', 'activity_id');
}