在形式上添加一对多 - 背包拉拉维尔

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

我的数据库结构中有以下

enter image description here

这是为了向比赛添加集合,并将比赛添加到锦标赛。

这些是我的模型

比赛模式:

<?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');
    }
}

现在,当我在后端创建锦标赛时,我希望拥有以下内容:

enter image description here

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

但是我有点纠结于如何做到这一点。有人可以在我路上帮助我吗?


答案 1

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

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

在您的模型(Match & Set)中,在数组中添加外键。我们可能需要它们。$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来添加锦标赛,比赛和套装。页面不会更改/重新加载。


答案 2

好吧,最好的是@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将请求中的比赛信息发送到控制器,上面的代码将保存它。对于更多集,请复制 a 集 html,但不要忘记输入名称。提供一些我们可以玩的代码。


推荐