Возникли некоторые проблемы с пониманием того, как прикрепить мой внешний ключ к моей дочерней записи, когда я вставляю его в свою базу данных. У меня есть класс казино, который может иметь много разных мест в казино (туалет, ресторан, услуги парковщика и т. Д.). Я пытаюсь создать новую запись в своей базе данных местоположения и включить внешний ключ (casino_Id), который является идентификатором таблицы казино. Я не уверен, как я смогу получить этот идентификатор, если я не передам его прямо из сообщения по маршруту, который я делаю в моем файле show.blade.php в моих представлениях казино.

<a href="/casino/{{ $casino->id }}/location/create"><button class="btn btn-primary">Add Location</button></a>

Не совсем уверен, является ли это практичным / безопасным способом передачи этой информации или как получить ее из моей функции создания. В настоящее время у меня есть первая запись о казино, которую он может найти в базе данных, чтобы увидеть, как она вставляет ее, которую он вставляет в базу данных, но не включает внешний ключ при вставке.

Web.php

//Location Routes
Route::get('/casino/{casino}/location/create', 'LocationController@create');
Route::post('/location', 'LocationController@store');
Route::get('/location/{location}', 'LocationController@show');
Route::get('/location/{location}/edit', 'LocationController@edit');
Route::patch('/location/{location}', 'LocationController@update');

Casino.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Casino extends Model
{

    public function locations() {
        return $this->hasMany(Location::class)->orderBy('title', 'ASC');
    }

}

Location.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Location extends Model
{
    protected $guarded = [];
    protected $fillable = ['title'];

    public function casino() {
        return $this->belongsTo(Casino::class);
    }

    public function duties() {
        return $this->hasMany(Duty::class)->orderBy('title', 'ASC');
    }

}

Создавать и хранить функции в моем LocationController.php

    public function create() {
        return view('locations.create');
    }

    public function store(Request $request) {
        $casino = Casino::find(1);

        $request->validate([
            'title' => 'required',

        ]);

        $casino->location = new location([
            'title' => $request->get('title'),
        ]);

        $casino->location->save();
        return redirect("/casino/1");

    }

0
poomulus 29 Окт 2019 в 11:43

1 ответ

Лучший ответ

Вы можете изменить свой маршрут с

Route::get('/casino/{casino}/location/create', 'LocationController@create');
Route::post('/location', 'LocationController@store');

К

Route::get('/casinos/{casino}/locations/create', 'LocationController@create');
Route::post('casinos/{casino}/location', 'LocationController@store');

Ваше действие создания

public function create(Casino $casino) 
{
    return view('locations.create', compact('casino'));
}

Действия вашего магазина

public store(Request $request, Casino $casino)
{
    $request->validate(['title' => 'required']);

    $casino->location()->create($request->validated());

    return redirect("/casino/{$casino->id}");
}

Привязка модели маршрута

2
Remul 29 Окт 2019 в 09:35