【问题标题】:Form model binding doesn't work on Edit form (multiple select)表单模型绑定在编辑表单上不起作用(多选)
【发布时间】:2017-03-14 23:33:50
【问题描述】:

我正在尝试重现与 Jeffrey Way 在此链接 https://laracasts.com/series/laravel-5-fundamentals/episodes/22 上的 Laravel 5 基本原理中显示的完全相同的内容@

从 10:08 开始密切关注

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

这是我的文章模型:

<?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);
    }

}

ArticlesController

<?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>

所以当我去编辑一篇文章时,没有选择多选标签:

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

【问题讨论】:

  • tags 是否在 DB 中的 store() 函数中正确创建?
  • 我得到 $tags 这样的:$tags = Tag::pluck('name', 'id');

标签: laravel laravel-5.3


【解决方案1】:

你可以试试:

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

Docs

【讨论】:

  • 请观看 10:08 开始的视频,我不想绑定表单模型,所以第三个参数必须是 null!
【解决方案2】:

你可以做两件事

  1. 在您的模型更改中

    公共函数 getTagListAttribute() { 返回 $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);
        }

【讨论】:

  • 谢谢。甚至这个工作:return $this-&gt;tags-&gt;pluck('id')-&gt;toArray();
  • 我得到 'htmlspecialchars() 期望参数 1 是字符串,给定数组'
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
相关资源
最近更新 更多