【问题标题】:Laravel 5.2 belongstoMany in viewsLaravel 5.2 属于视图中的许多
【发布时间】: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' =&gt; $people)
  • 谢谢你。我还很新,我还不明白何时使用 ->with 以及何时使用 compact($,$) 的区别。我用摆弄更新了上面的代码并让它工作。但这也许与我无法保存新的原因有关。 $place-&gt;people()-&gt;sync($input); 是我能得到的最接近的,但它不能正常工作(它将整个数组放入数据库并产生大量虚假记录。)

标签: php laravel eloquent many-to-many laravel-5.2


【解决方案1】:

在 PlacesController 中,您的 edit($id) 方法不会将人员数组传递给视图。

/**
 * 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');
} 

【讨论】:

  • 无法编辑我的帖子,因为编辑器由于某种原因被窃听,它会在我写作时自动删除内容。无论如何,我想添加一个更新方法,当用户从选择框中添加或删除一个人时,您可以使用Place::people()-&gt;sync($peopleIds); 更新数据透视表中的 ID。 attach()detach() 通常用于在数据透视表中手动添加和删除 id。
  • 我对该代码进行了一些处理并使其正常运行(更新了原始问题)。但是,我无法从您的编辑中获取信息来工作。然后我只添加 Place::people()->sync($peopleIds);我得到Non-static method ss\Place::people() should not be called statically, assuming $this from incompatible context 我知道 $peopleIds 没有变量,但该类肯定存在并且命名空间。
  • $peopleIds 应该来自输入 people,如 $peopleIds = $request-&gt;get('people');,并且 people() 方法通常是关系方法的名称(假设您将其称为 people)。尝试 Place::with('people')->people()->sync($peopleIds) 或者不使用外观,使用构造函数依赖注入和调用就像$this-&gt;place-&gt;people($peopleIds);。我不在控制器中使用外观。
  • 哦,在update($id) 方法中使用$request-&gt;except('people'); 而不是$request-&gt;all() 作为$input 变量,这样您就可以忽略选择框并避免错误。
  • (对不起,输入太快)我完全没有得到任何东西。现在我收到Undefined property: ss\Http\Controllers\PlaceController::$place。是否有在 Laravel 中建立多对多关系的好资源?失败得很惨,我只能假设这是因为我缺乏理解并试图遵循可能不适合正确版本的文档。并尝试用我自己的人物、地点代替最常见的示例博客和标签,并且肯定会在某个地方混合一些东西!感谢您的所有帮助。我需要做一些繁重的阅读。
猜你喜欢
  • 2016-07-08
  • 2016-06-02
  • 2023-03-03
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2016-12-15
  • 2017-02-17
相关资源
最近更新 更多