形式加一到多-背包laravel

Add one to many in form - Backpack laravel

我正在使用 Backpack for Laravel 来提供我的 laravel 网站的后端区域。

我的数据库结构中有以下

这是为比赛添加套数,并为锦标赛添加比赛。

这些是我的模型

锦标赛模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;

class Tournament extends Model
{
    use CrudTrait;

     /*
    |--------------------------------------------------------------------------
    | GLOBAL VARIABLES
    |--------------------------------------------------------------------------
    */

    protected $fillable = ['from', 'to', 'type', 'location', 'place'];

    /*
    |--------------------------------------------------------------------------
    | RELATIONS
    |--------------------------------------------------------------------------
    */

    public function matches()
    {
        return $this->hasMany('App\Models\Match');
    }
}

匹配模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;

class Match extends Model
{
    use CrudTrait;

     /*
    |--------------------------------------------------------------------------
    | GLOBAL VARIABLES
    |--------------------------------------------------------------------------
    */

    protected $table = 'matches';

    protected $fillable = ['opponent'];

    /*
    |--------------------------------------------------------------------------
    | RELATIONS
    |--------------------------------------------------------------------------
    */

    public function sets()
    {
        return $this->hasMany('App\Models\Set');
    }
}

设置模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;

class Set extends Model
{
    use CrudTrait;

     /*
    |--------------------------------------------------------------------------
    | GLOBAL VARIABLES
    |--------------------------------------------------------------------------
    */

    protected $fillable = ['self', 'opponent', 'index'];

    public function match()
    {
        return $this->belongsTo('App\Models\Match');
    }
}

现在我想在后端创建锦标赛时拥有以下内容:

我已经可以设置从、到、类型、位置和地点。但是现在我希望可以添加匹配项并向该匹配项添加集合。这一切都在一页上。

但我对如何执行此操作有点困惑。有人可以帮我吗?

您需要在 JavaScript 中包含您的部分逻辑。在您的示例中,当您单击 'Add another match' 按钮时,您将操纵 HTML DOM 并复制 'Add Match' 框。

填完整个表格后,它会被提交到服务器。

然后服务器需要:

  1. 创建一个新的 Tournament 对象并保存。

  2. 循环提交的比赛并创建新的 Matches 对象,然后 link 将它们添加到之前创建的锦标赛中。遍历提交的集合并将它们 link 到创建的匹配项。

我认为您应该将其设计为在显示添加 match/set 表单之前先创建锦标赛。通过应用 Ajax 或 Vue.js 等,仍然可以将它们全部以一种形式呈现。

  1. 添加新锦标赛成功后,隐藏表格并显示新锦标赛信息以及添加新比赛表格。

  2. 当新匹配添加成功后,清除新匹配表单并加载新匹配信息。

注意:我想知道你打算如何允许添加对手。

干杯!

我建议大家分多个步骤进行。创建锦标赛,转到锦标赛视图,添加比赛。转到匹配视图,添加集。 Wayyyy 比你想做的更容易。但是,嘿,这是你的应用程序,你想一次性完成。

会有一些限制,例如您一次只能提交一场比赛,以避免混淆您的比赛。除非你想使用 javascript 并自动命名你的匹配项和集合。

在您的模型(匹配和设置)中,在 $fillable 数组中添加外键。我们可能需要它们。

因此,当您提交表单时,您就创建了锦标赛

public function save(Request $request)
{
    $tournament = Tournament::create([
        ...
    ]);

    $match = Match::create([
        'tournament_id' => $tournament->id,
        ...
    ]);

    $match->sets()->saveMany([
        new Set(['self' => $request->set1_self, ...]), //foreign key auto inserted
        new Set(['self' => $request->set2_self, ...]),
        new Set(['self' => $request->set3_self, ...]),
    ]);
}

这意味着在您的表单中,您必须将您的设置输入命名为

<input name="set1_self"/>
<input name="set1_opponent"/>

等等。

现在,如果您想同时进行多个匹配,则必须找到一种方法来命名您的输入,例如

<input name="match1_set1_self" />
<input name="match1_set2_self" />

等等。

既然你想把所有的东西都放在一页上。您可以构建一个迷你 SPA 来添加锦标赛、比赛和组合。该页面不会 change/reload.

好吧,最好的就是@EddyTheDove提到的,

$match->sets()->saveMany([
    new Set(['self' => $request->set1_self, ...]);
    new Set(['self' => $request->set2_self, ...]);
    new Set(['self' => $request->set3_self, ...]);
]);

但应该通过 Ajax 立即完成,而且 vue.js 也会很棒。 Ajax 调用以创建新锦标赛,在同一调用中获取所有比赛并附加所选比赛,再次 Ajax 请求将比赛添加到之前创建的锦标赛中 Ajax打电话。

通过ajax将请求中的匹配信息发送到控制器,上面的代码将在其中保存它。对于更多集合,复制集合 html 但不要忘记输入名称。提供一些我们可以玩的代码。