Вставка массива и данных в таблицу и кросс-таблицу из 1 Eloquent Model - Vue - Laravel - PullRequest
2 голосов
/ 21 мая 2019

База данных содержит 3 таблицы: 1 таблица видов, панель и перекрестная таблица видов.Отношения следующие 1 панель может содержать множество видов.Поэтому я использую отношения 1 ко многим.Данные, которые должны быть вставлены в таблицу названия таблицы и описания.Таблица видов остается неизменной.А также данные должны быть введены в кросс-таблицу.

Для моей таблицы панели: ключ добавлен, но имя и описание столбца только что получили значение NULL вместо значения.Для моей кросс-таблицы: ничего не вставлено.

Почему мои данные не могут быть вставлены?Я что-то упускаю, я этого не вижу.Спасибо за помощь.

Таблица видов

        +----+-----------------+
        | id | name            |
        +----+-----------------+
        | 1  | Spider Monkey   |
        +----+-----------------+
        | 2  | Squirrel Monkey |
        +----+-----------------+
        | 3  | Vervet Monkey   |
        +----+-----------------+
        | 4  | Dorset Horn     |
        +----+-----------------+
        | 5  | Dorper          |
        +----+-----------------+
        | 6  | Javan Warty Pig |
        +----+-----------------+
        | 7  | Wild Boar       |
        +----+-----------------+

Как должны выглядеть данные в других таблицах.

Панель стола

        +----+------+-------------+
        | id | name | description |
        +----+------+-------------+
        | 1  | P001 | Monkeys     |
        +----+------+-------------+
        | 2  | P002 | Sheeps      |
        +----+------+-------------+
        | 3  | P003 | Porks       |
        +----+------+-------------+

таблица видов_панели

        +----+----------+---------+
        | id | panel_id | species |
        +----+----------+---------+
        | 1  | 1        | 1       |
        +----+----------+---------+
        | 2  | 1        | 2       |
        +----+----------+---------+
        | 3  | 1        | 3       |
        +----+----------+---------+
        | 4  | 2        | 4       |
        +----+----------+---------+
        | 5  | 2        | 5       |
        +----+----------+---------+
        | 6  | 3        | 6       |
        +----+----------+---------+
        | 7  | 3        | 7       |
        +----+----------+---------+

Мой код:

видов.все

<code>            <template>
         <b-card title="Database" >
            <div class="container-fluid">
                    <div class="row md-4" v-show="selectedSpecies.length > 0">
                        <div class="col-2">
                            <label for="example-date-input">Delivery date</label>
                        </div>
                        <div class="col-6">
                            <label for="example-date-input">Describe your panel</label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-2">
                            <b-form-input v-model="date" class="form-control" type="date" value="getDate" ></b-form-input>
                            <pre class="mt-3 mb-0">{{ date }}
{{ description }}
Запросить пул {{row.item.name}} {{row.item.name}}

Часть javascript

           // used to get ids from my array
            idsSelecter (array){

            this.selectedSpecies.forEach(obj => {
                array.push(obj.id);
                });
            console.log(array);
            return array;
    },
                 storePanel: async function(){
            axios.post('/panel',{

                description: this.description,
                date: this.date,
                selectedIds: this.idsSelecter(selectedIds)
            })
            .then(function (response) {
                console.log(response);
            })
            .catch(function (error) {
                console.log(error);
            })
            .finally(function () {
                // always executed
            });

kind.php

        class Specie extends Model
        {
            public function panel() {
                return $this->belongsTo('App\Panel'); 
            }
        }

panel.php

        class Panel extends Model
        {
            protected $guarded  = []; 
            public function species()
            {
                return $this->hasMany('App\Specie', 'panel_id');
            }
        }

index.blade.php

            @extends('layouts.app')
        @section('content')
            <div class="container col-sm-10">
                {!! Form::open(['action' => 'PanelController@store', 'method' => 'POST'])!!}
                <species-overview :speciedata='<?php echo json_encode($species); ?>' 
                ></species-overview>
                {!! Form::close() !!}
            </div>
        @endsection

PanelController.php

          public function store(Request $request)
        {
            $panel = Panel::create([
                'description' =>  $request->description,
                'date' => $request->date
            ]);
            foreach($request->selectedIds as $selectedid){
                $specie = new Specie(['specie_id' => $selectedid]);
                $specie->panel()->assosciate($panel);
                $panel->save();
            }
            return redirect()->route('specie.index')->with('success','Data Added');


        }

1 Ответ

1 голос
/ 24 мая 2019

Я бы представил следующее решение.Вместо HTTP-запросов с использованием Axios используйте вашу форму для отправки данных в вашу базу данных.Таким образом, вы должны назвать свои для представленных значений.

<code> <div class="col-2">
                        <b-form-input v-model="date" class="form-control" type="date" value="getDate" name="date"></b-form-input>
                        <pre class="mt-3 mb-0">{{ date }}
{{ description }}

Для ваших идентификаторов я бы представил следующее:

                        <template slot="name" slot-scope="row" >
                        {{row.item.name}}
                        // Consider this a hidden input field where your ids can be stored in array
                        <input name="species[]" type="hidden" v-model="row.item.id">
                    </template>

Это отношение многие ко многим.Ваши панели могут содержать особи, которые представлены в разных панелях.Обратитесь также к вашей кросс-таблице, так что теперь laravel будет куда вставлять ваши данные.Это не всегда nesscairy, но в некоторых случаях как.

    public function species()
{
    return $this->belongsToMany('App\Specie', 'antibody_panels','panel_id','specie_id');
}


     public function panel() {
    return $this->belongsToMany('App\Panel','specie_panels','specie_id','panel_id'); 
}

Вы должны использовать attach при работе с отношениями "многие ко многим".Вы также можете удалить save (), автоматически создавать сохранения.

        foreach($selectedIds as $selectedid){
        $panel->species()->attach(Specie::find($selectedid));
    } 

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...