Добавьте один ко многим по форме - рюкзак 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 и т.д.

  • После успешного добавления нового турнира скрыть форму и отобразить новую информацию о турнире вместе с новой формой соответствия.

  • Когда новое совпадение будет успешно добавлено, очистите новую форму соответствия и загрузите новую информацию о совпадении.

Примечание. Интересно, как вы планируете допустить, чтобы противник был добавлен.

Ура!