Laravel - how to pass the foreign key without user selecting it

Laura :

I have two database tables, Trips and Events. I have created a relationship between them in Laravel. One trip can have many events.

I have created a button 'Add Event' which brings the user to a form. However at the minute in order to pass the foreign key, 'trip_id' when adding an event, I created a drop down select.

I want to remove this and have the 'trip_id' automatically selected in the background so the user doesn't need to.

editTrip.blade.php

<a href="/trips/{id}/edit/AddEvent" class="btn btn-success"> Add Event</a>

<table class="table table-striped table-bordered table-hover">
    <thead class="thead">
        <tr class="warning">
            <th>Category</th>
            <th>Event Name</th>
            <th>Start Date</th>
            <th>End Date</th>
            <th>Time</th>
            <th>Address</th>
            <th>Notes</th>
            <th>Edit</th>
            <th>Delete</th>
        </tr>
    </thead>
    <tbody>
    @foreach($trip->events as $event)
        <tr>
            <td> </td>
            <td>{{ $event->event_name }}</td>
            <td>{{ $event->start_date }}</td>
            <td>{{ $event->end_date }}</td>
            <td> </td>
            <td> </td>
            <td> </td>
            <th>
            <a href="/events/{{$event->id}}/editEventForm" class="btn btn-primary" role="button" aria-pressed="true">Edit</a>
          </th>
        <th>
        <form action="{{route('events.destroy',[$event->id])}}" method="POST">
          @method('DELETE')
          @csrf
          <button class="btn btn-danger">Delete</button>
        </form>
      </th>
        </tr>
    @endforeach
    </tbody>
</table>

<br />
<hr>


<div class="panel panel-primary">
  <div class="panel-heading"></div>
  <div class="panel-body">
    <br>
    {!! $calendar_details->calendar() !!}
    {!! $calendar_details->script() !!}
  </div>
</div>

addEvent.blade.php

{!! Form::open(array('route' => 'events.add', 'method'=>'POST', 'files'=>'true')) !!}

  <div class="form-group">
    @if (Session::has('sucess'))
      <div class="alert alert-sucess">{{ Session::get('sucess') }}</div>
    @elseif (Session::has('warning'))
      <div class="alert alert-danger">{{ Session::get('warning') }}</div>
      @endif
    </div>

    <div class="form-group">
    <div class="form-group">
        {!! Form::label('trip_id', 'Destination:') !!}
        <select class="form-control" name="trip_id">
          @foreach($trips as $trip)
            <option value='{{ $trip->id}}'>{{$trip->destination}}</option>
          @endforeach
        </select>
      </div>
    </div>

<div class="form-group">
  <div class="form-group">
    {!! Form::label('event_name', 'Add Event:') !!}
    <div class="">
      {!! Form::text('event_name', null, ['class' => 'form-control']) !!}
      {!! $errors->first('event_name', '<p class="alert alert-danger">:message</p>') !!}
    </div>
  </div>
</div>

<div class="form-group">
  <div class="form-group">
    {!! Form::label('start_date', 'Start Date:') !!}
    <div class="">
      {!! Form::date('start_date', null, ['class' => 'form-control']) !!}
      {!! $errors->first('start_date', '<p class="alert alert-danger">:message</p>') !!}
    </div>
  </div>
</div>


<div class="form-group">
  <div class="form-group">
    {!! Form::label('end_date', 'End Date:') !!}
    <div class="">
      {!! Form::date('end_date', null, ['class' => 'form-control']) !!}
      {!! $errors->first('end_date', '<p class="alert alert-danger">:message</p>') !!}
    </div>
  </div>
</div>

<div class="form-group" &nbsp;<br/>
{!! Form::submit('Add Event', ['class' => 'btn btn-primary']) !!}

{!! Form::close() !!}

EventController.php

public function addEvent(Request $request)
{
  $validator = Validator::make($request->all(),[
    'event_name' => 'required',
    'start_date' => 'required',
    'end_date' => 'required',
    'trip_id'=> 'required',
  ]);

  if($validator->fails()) {
    \Session::flash('warning', 'Please enter the valid details');
    return redirect('/events')->with('input', Input::all());
  }

  $events = new Events;
  $trips = Trip::all();
  $events->event_name = $request['event_name'];
  $events->start_date = $request['start_date'];
  $events->end_date = $request['end_date'];
  $events->trip_id = $request['trip_id'];
  $events->save();

return redirect('trips')->with('success', 'The new event has been added to your trip')->with('trips', $trips);
}

public function display()
{
  $trips = Trip::all();
  $user_id = Auth::id();
  $user = User::find($user_id)->trips()->paginate(10);

  return view('/addEvent')->with('trips', $user);
}

web.php

Route::get('/trips/{id}/edit/AddEvent', 'EventController@display')->name('events.display');
Route::post('/addEvents', 'EventController@addEvent')->name('events.add');
Route::get('/trips/{id}/edit', 'TripController@edit')->name('trips.edit');
porloscerros Ψ :

In your addEvent.blade you can remove the select and add a hidden input:

<input value="{{ $trip_id }}" name="trip_id" hidden="true"/>

Then you'll have to return the Trip id from your controller.

But first you have to fix the link url in editTrip.blade, to pass the right value:

<a href="/trips/{{$trip->id}}/edit/AddEvent" class="btn btn-success">Add Event</a>

And since you'll have the trip id as a route parameter {id}:

Route::get('/trips/{id}/edit/AddEvent', 'EventController@display')->name('events.display');

You can get it in the function argument and return it with the view:

public function display($id)
{
  return view('/addEvent')->with('trip_id', $id);
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=9824&siteId=1