Добавьте один ко многим по форме - рюкзак laravel
Я использую рюкзак для 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');
}
}
Теперь я хотел бы иметь следующее, когда создаю турнир в бэкэнд:
![введите описание изображения здесь]()
Я уже могу установить из, в, тип, местоположение и место. Но теперь мне хотелось бы добавить совпадение и добавить наборы для этого совпадения. Это все на одной странице.
Но я немного зациклен на том, как это сделать. Может кто-нибудь помочь мне на моем пути?
Ответы
Ответ 1
Я бы рекомендовал всем сделать несколько шагов. Создайте турнир, перейдите в режим турнира, добавьте совпадения. Перейдите в представление соответствия, добавьте наборы. Wayyyy проще, чем вы хотите. Но эй, это ваше приложение, и вы хотите сделать это за один раз.
Там будут некоторые ограничения, например, вы можете отправлять только одно совпадение за раз, чтобы не смешивать ваши наборы. Если вы не хотите использовать javascript и автоматически укажете свои совпадения и настройки.
В ваших моделях (Match and 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, где вышеуказанный код сохранит его. Для большего количества наборов Дублируйте набор html, но не забудьте имена ввода. Предоставьте код, с которым мы можем играть.
Ответ 3
Вам нужно будет иметь часть своей логики в JavaScript. В вашем примере, когда вы нажимаете кнопку "Добавить другое совпадение", вы будете манипулировать HTML DOM и дублировать поле "Добавить матч".
После заполнения всей формы он будет отправлен на сервер.
Затем серверу необходимо:
-
Создайте новый объект турнира и сохраните его.
-
Прокрутите полученные матчи и создайте новые объекты "Матчи" и свяжите их с ранее созданным турниром. Перемещайтесь через представленные наборы и связывайте их с созданным соответствием.
Ответ 4
Я думаю, вы должны создать его таким образом, чтобы турнир был создан первым, пока не появится форма добавления/набора. Все еще возможно, чтобы все они были в одной форме, если применить Ajax или Vue.js и т.д.
-
После успешного добавления нового турнира скрыть форму и отобразить новую информацию о турнире вместе с новой формой соответствия.
-
Когда новое совпадение будет успешно добавлено, очистите новую форму соответствия и загрузите новую информацию о совпадении.
Примечание. Интересно, как вы планируете допустить, чтобы противник был добавлен.
Ура!