17

我正在使用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');
    }
}

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

在此处输入图像描述

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

但我有点坚持如何做到这一点。有人可以帮我吗?

4

4 回答 4

5

我建议所有人分多个步骤进行。创建锦标赛,进入锦标赛视图,添加比赛。转到匹配视图,添加集合。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 来添加锦标赛、比赛和套装。该页面不会更改/重新加载。

于 2017-03-08T05:50:20.167 回答
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 调用创建一个新的锦标赛,Aong 在同一个调用中获取所有匹配项并附加选定的匹配项,Ajax 再次请求将匹配项添加到在早期 Ajax 调用中创建的锦标赛中。

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

于 2017-03-09T19:24:13.817 回答
0

您将需要在 JavaScript 中包含部分逻辑。在您的示例中,当您单击“添加另一个匹配”按钮时,您将操纵 HTML DOM 并复制“添加匹配”框。

填写完整表格后,将提交到服务器。

然后服务器需要:

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

  2. 循环提交的比赛并创建新的 Matches 对象并将它们链接到先前创建的锦标赛。循环提交的集合并将它们链接到创建的匹配项。

于 2017-03-03T21:51:06.450 回答
0

我认为您应该以这样一种方式设计它,即在显示添加匹配/设置表单之前首先创建锦标赛。通过应用 Ajax 或 Vue.js 等,仍然可以将它们全部放在一种形式中。

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

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

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

干杯!

于 2017-03-06T09:05:44.170 回答