表单模型绑定不适用于编辑表单(多个 select)

Form model binding doesn't work on Edit form (multiple select)

我正在尝试重现 Jeffrey Way 在 Laravel 5 基础知识中显示的完全相同的内容 link https://laracasts.com/series/laravel-5-fundamentals/episodes/22

密切关注 10:08

但是我的编辑表单在创建表单时没有显示 selected 标签...我可能错过了一些东西,但我就是看不到它。

这是我的文章模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;

class Article extends Model
{

    protected $fillable = [
        'title',
        'body',
        'published_at'
    ];

    protected $dates = ['published_at'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }

    public function getTagListAttribute()
    {
        return $this->tags->pluck('id');
    }

    public function setPublishedAtAttribute($date)
    {
        $this->attributes['published_at'] = Carbon::createFromFormat('d.m.Y H:i', $date)->format('Y-m-d H:i:s');
    }

    public function getPublishedAtAttribute($date)
    {    
        return Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('d.m.Y H:i');
    }

    public function scopePublished($query)
    {
        $query->where('published_at', '<=', Carbon::now());
    }

    public function scopeUnpublished($query)
    {
        $query->where('published_at', '>', Carbon::now());
    }
}
?>

标签模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{

    public function articles()
    {
        return $this->belongsToMany(Article::class);
    }

}

文章控制器

<?php

namespace App\Http\Controllers;

use App\Article;
use App\Http\Requests\ArticleRequest;
use Auth;
use App\Tag;

class ArticlesController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $articles = Article::latest('published_at')->unpublished()->get();

        return view('articles.index', compact('articles'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        $tags = Tag::pluck('name', 'id');

        return view('articles.create', compact('tags'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(ArticleRequest $request)
    {

        //dd($request->all());
        $article = Auth::user()->articles()->create($request->all());

        $article->tags()->sync($request->input('tag_list'));

        return redirect('articles')->with('success', "Successfully created a new Article!");
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show(Article $article)
    {

        return view('articles.show', compact('article'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit(Article $article)
    {


        $tags = Tag::pluck('name', 'id');

        return view('articles.edit', compact('article', 'tags'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(ArticleRequest $request, Article $article)
    {
        $article->update($request->all());

        $article->tags()->sync($request->input('tag_list'));

        return redirect('articles')->with('success', "Successfully updated the Article!");
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy(Article $article)
    {
        //
    }
}
?>

edit.blade.php 查看

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row">
        <div class="col-md-12">
            <div class="panel panel-default">
                <div class="panel-heading"><h1>Edit {{ $article->title }}</h1></div>

                <div class="panel-body">

                    {!! Form::model($article, ['method' => 'PATCH', 'action' => ['ArticlesController@update', $article->id]]) !!}

                        @include('articles._form', ['submitButtonText' => 'Update Article'])

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

                </div>
            </div>
        </div>
    </div>
</div>
@endsection

_form.blade.php部分

<div class="form-group">
    {!! Form::label('title', 'Title:') !!}
    {!! Form::text('title', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
    {!! Form::label('body', 'Body:') !!}
    {!! Form::textarea('body', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
    {!! Form::label('published_at', 'Published On:') !!}
    {!! Form::text('published_at', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
    {!! Form::label('tag_list', 'Published On:') !!}
    {!! Form::select('tag_list[]', $tags, null, ['class' => 'form-control', 'multiple']) !!}
</div>

<div class="form-group">
    {!! Form::submit($submitButtonText, ['class' => 'btn btn-primary form-control']) !!}
</div>

所以当我去编辑一篇文章时,多个 select 标签不是 selected:

它根本不起作用,我不知道哪里出了问题....如果您需要任何其他源代码,我会提供它。

您可以试试:

{!! Form::select('tag_list', $tags, $article->tags->pluck('id')->all(), ['class' => 'form-control', 'multiple']) !!}

Docs

你可以做 2 件事

  1. 在你的模型变化中

    public 函数 getTagListAttribute() { return $this->tags->pluck('id'); }

收件人:

public function getTagListAttribute()
    {
    $tags = $this->tags->pluck('id');
    return $tags->all()
    }

或者 2. 从

更改模型
public function getTagListAttribute()
    {
    return $this->tags->pluck('id');
    }

public function getTagListAttribute()
        {
        return array_pluck($this->tags,'id);
        }