形式加一到多-背包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' 框。
填完整个表格后,它会被提交到服务器。
然后服务器需要:
创建一个新的 Tournament 对象并保存。
循环提交的比赛并创建新的 Matches 对象,然后 link 将它们添加到之前创建的锦标赛中。遍历提交的集合并将它们 link 到创建的匹配项。
我认为您应该将其设计为在显示添加 match/set 表单之前先创建锦标赛。通过应用 Ajax 或 Vue.js 等,仍然可以将它们全部以一种形式呈现。
添加新锦标赛成功后,隐藏表格并显示新锦标赛信息以及添加新比赛表格。
当新匹配添加成功后,清除新匹配表单并加载新匹配信息。
注意:我想知道你打算如何允许添加对手。
干杯!
我建议大家分多个步骤进行。创建锦标赛,转到锦标赛视图,添加比赛。转到匹配视图,添加集。 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 但不要忘记输入名称。提供一些我们可以玩的代码。
我正在使用 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' 框。
填完整个表格后,它会被提交到服务器。
然后服务器需要:
创建一个新的 Tournament 对象并保存。
循环提交的比赛并创建新的 Matches 对象,然后 link 将它们添加到之前创建的锦标赛中。遍历提交的集合并将它们 link 到创建的匹配项。
我认为您应该将其设计为在显示添加 match/set 表单之前先创建锦标赛。通过应用 Ajax 或 Vue.js 等,仍然可以将它们全部以一种形式呈现。
添加新锦标赛成功后,隐藏表格并显示新锦标赛信息以及添加新比赛表格。
当新匹配添加成功后,清除新匹配表单并加载新匹配信息。
注意:我想知道你打算如何允许添加对手。
干杯!
我建议大家分多个步骤进行。创建锦标赛,转到锦标赛视图,添加比赛。转到匹配视图,添加集。 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 但不要忘记输入名称。提供一些我们可以玩的代码。