【发布时间】:2016-07-16 20:35:31
【问题描述】:
我正在尝试在 Laravel 5.2.39 中建立人物和地点之间的 belongstoMany 关系,但无法将信息传递到选择框中的视图中。我刚得到:“错误异常:未定义的变量:人”。它也不会保存和制作数据透视表条目。
我创建了带有“place_id”和“person_id”列的数据透视表person_place,它们对应于“people”和“places”表。
App/Person.php(人物模型)
<?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(地点模型)
<?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(位置控制器)
<?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(地点视图,我正在尝试构建选择列表 - 不起作用)
@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 视图可以工作,但在保存时不会生成数据透视表)
@section('aside')
{!! Form::select('people', $people, null, ['class' => '', 'multiple']) !!}
@endsection
尝试了“with”和“attach”的各种方法,都无法得到结果。有趣的是,即使我在我的编辑方法中专门放置了 "$person = "foo"; 它仍然说它是未定义的。
感谢您的帮助。
编辑:更新代码
【问题讨论】:
-
如果我必须打赌,我会说 PHP 的
compact()不能很好地与 Laravel 的view()配合使用。您是否尝试过传递标准数组,例如array('people' => $people)? -
谢谢你。我还很新,我还不明白何时使用 ->with 以及何时使用 compact($,$) 的区别。我用摆弄更新了上面的代码并让它工作。但这也许与我无法保存新的原因有关。
$place->people()->sync($input);是我能得到的最接近的,但它不能正常工作(它将整个数组放入数据库并产生大量虚假记录。)
标签: php laravel eloquent many-to-many laravel-5.2