2017-02-28 15 views
14

我使用Backpack for Laravel來提供我的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

我已經可以從,到,類型,位置和設置到位。但是現在我希望能夠添加一個匹配併爲這個匹配添加集合。這一切都在一個頁面上。

但我有點卡住如何做到這一點。有人可以在我的路上幫助我嗎?

回答

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來添加錦標賽,匹配&套。該頁面不會更改/重新加載。

0

您將需要在JavaScript中擁有部分邏輯。在您的示例中,當您單擊「添加其他匹配」按鈕時,您將操縱HTML DOM並複製「添加匹配」框。

填寫整個表格後,它會被提交給服務器。

然後,服務器需要:

  1. 創建一個新的比賽對象,並將其保存。

  2. 循環提交的匹配項並創建新的Matches對象並將它們鏈接到先前創建的錦標賽。循環提交的集合並將它們鏈接到創建的匹配。

0

我認爲你應該以這樣的方式設計它,比賽是在顯示添加比賽/設置表單之前先創建的。它仍然是有可能讓他們都在同一個形式,雖然被成功添加,隱藏窗體並顯示新的賽事信息以及添加新應用的Ajax或Vue.js等

  1. 了新的賽之後比賽形式。

  2. 當新的匹配成功添加後,清除新的匹配表單並加載新的匹配信息。

注:我想知道你打算如何讓對手加入。

乾杯!

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發送給控制器,上面的代碼將保存它。對於更多集合,請複製一個集合html,但不要忘記輸入的名稱。提供一些我們可以玩的代碼。

+0

很好,另外,vue.js可以使它更簡單。 – 2017-03-09 19:26:45

相關問題