简体   繁体   中英

Laravel 5.2 belongstoMany in views

I'm trying to make a belongstoMany relationship in Laravel 5.2.39 between people and places but am unable to pass the information into a view in a select box. I just get: "Error Exception: Undefined variable: people". It also is not saving and making the pivot table entries.

I have created the pivot table person_place with 'place_id' and 'person_id' columns which correspond to the 'people' and 'places' table.

App/Person.php (Person Model)

<?php
namespace ss;
use ss\Place;

use Illuminate\Database\Eloquent\Model;

class Person extends Model
{
    /**
     * Fillable fields
     * 
     * @var array
     */
    protected $fillable = [
        'name',
        'type',
        'status',
        'notes',
        'email',
        'phone',
        'alt',
        'web',
        'first',
        'last',
        'title',
    ];

    public function places()
    {
        return $this->belongsToMany('Place');
    }
}

App/Place.php (Place Model)

<?php
namespace ss;
use ss\Person;

use Illuminate\Database\Eloquent\Model;

class Place extends Model
{
    /**
     * Fillable fields
     * 
     * @var array
     */
    protected $fillable = [
        'name',
        'type',
        'status',
        'notes',
        'email',
        'phone',
        'alt',
        'web',
        'address1',
        'address2',
        'city',
        'state',
        'zip',
        'country',
    ];

    public function people()
    {
        return $this->belongsToMany('Person');
    }

}

App/Http/Controllers/PlaceController.php (Places Controller)

 <?php namespace ss\Http\Controllers;
use ss\Place;
use ss\Person;
use ss\Http\Requests;
use Illuminate\Http\Request;
use View;
use Session;

class PlaceController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        $places = Place::all();
        $people = Person::pluck('name','id')->all();

        return View::make('places.index', compact('places','people'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        $people = Person::lists('last', 'id');

        return view('places.create', compact('people'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required'
        ]);

        $input = $request->all();
        Place::create($input);

        Session::flash('flash_message', 'Place successfully added!');
        return redirect()->action('PlaceController@index');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        $place = Place::findOrFail($id);
        return view('places.show')->withPlace($place);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id)
    {
        $place = Place::findOrFail($id);
        $people = Person::pluck('name','id')->all();

        return view('places.edit', compact('place','people'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function update($id, Request $request)
    {
        $this->validate($request, [
            'name' => 'required'
        ]);

        $input = $request->except('people');

        $place = Place::findOrFail($id);
            $peopleIDs = $this->place->people($peopleIds);

        $place->fill($input)->save();
        Session::flash('flash_message', 'Place successfully edited!');
        return redirect()->action('PlaceController@index', $place);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id)
    {
        $place = Place::findOrFail($id);
        $place->delete();

        Session::flash('flash_message', 'Place successfully deleted!');
        return redirect()->action('PlaceController@index');
    }

}

resources/views/places/edit.blade.index.php (Places View, where I'm trying to build select list -not working)

@section('aside')
        {!! Form::select('people', $people, null, ['class' => '', 'multiple']) !!}

<ul class="section table-of-contents">
    <li><a href="#introduction">New Time</a></li>
    <li><a href="#structure">New Money</a></li>
    <li> </li>
    <li><a href="#initialization">New Sub-Task</a></li>
</ul>
@endsection

resources/views/places/create.blade.index.php (Places View with a select list that works but does not make a pivot table when saving)

@section('aside')
            {!! Form::select('people', $people, null, ['class' => '', 'multiple']) !!}
@endsection

Have tried various methods of "with" and "attach" and am unable to get a result. Interestingly, even if I specifically place "$person = "foo"; in my edit method it still says it is undefined.

Thank you for your help.

EDIT: Updated Code

In the PlacesController, your edit($id) method does not pass an array of people to the view.

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return Response
 */
public function edit($id)
{
    $place = Place::findOrFail($id);
    $people = People::pluck('name','id')->all();
    return view('places.edit', compact('place', 'people');
} 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM