使用单个表单Laravel

时间:2017-06-04 13:38:38

标签: php mysql database laravel

我正在尝试在db上插入一篇博文,我有两个表帖子和标签表。当我插入创建帖子时,我希望能够从这两个不同的表中的表单中插入数据。

create.blade.php;

<div class="account_grid">

<div class="col-md-6 login-right wow fadeInRight col-md-offset-3" data-wow-delay="0.4s">
    <h3>CREATE A BLOG POST</h3>
    <p>Please fill out the required fields *</p>
    <form method="post" action="/posts"  enctype="multipart/form-data">
         {{csrf_field()}}
        <div>
            <span>Title:<label>*</label></span>
            <input type="text" id="title" name="title"  > 
        </div>
        <div>
            <span>Body<label>*</label></span>
            <textarea id="body" name="body" rows="14"  ></textarea>
        </div>
        <div>
            <span>Tags:<label>*</label></span>
            <input type="text" id="tags" name="tags">
        </div>
        <div>
            <span>Image<label>*</label></span>
            <input type="file" name="image" id="image"  >
        </div>
        <input type="submit" value="Publish">

    </form>

@include('layouts.errors')
</div>  
<div class="clearfix"> </div>
</div>

在我的路径文件中,我有通向PostsController.php的路径,它有一个如下所示的存储方法:

PostsController.php

    public function store(Request $request){

        $this->validate($request, [

            'title' =>'required|max:48',
            'body'=>'required',
            'image'=>'required',
            'tags' =>'required|max:200'
        ]);

        $post = new Post;

        $destination ='uploads';
        $image = $request->file('image');
        $filename = $image->getClientOriginalName();
        $image->move($destination, $filename);
        $location=$destination.'/'.$filename;
        $tags = request('tags');


           Post::create([
            'title'=>request('title'),
            'body' =>request('body'),
            'user_id'=>auth()->id(),
            'image' =>$destination.'/'.$filename

        ]);

        $tag = new Tag;

        Tag::create([

            'name' => $tags
        ]);

        return redirect('/blog');
    }
}

问题在于,当我调用方法时,我希望将表单数据保存在两个不同的表中,我尝试过以下但是我得到了错误:

Model.php第232行中的MassAssignmentException: 名称

我研究了这个问题,但没有运气;是的,我确实有这个名字&#39;列在受保护的$ fillable数组中。关于如何在两个不同的表中存储数据或我应该使用什么类型的关系的任何建议。

在post.php模型上我确实有一个关系。标签belongsToMany以及我的tag.php模型Post belongsToMany

p.s Laravel的新手。

tag.php模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    //

        public function posts(){

        return $this->belongsToMany(Post::class);
    }

    public function getRouteKeyName(){

        return 'name';

    }
}

Post.php模型:

<?php

namespace App;
use Carbon\Carbon;
class Post extends Model
{

    public function comments(){

        return $this->hasMany(Comment::class);
    }

    public function addComment($body, $name, $email, $user_id){

        $this->comments()->create(compact('body','name','email', 'user_id'));
    }

    public function user(){ // $comment->user->name

        return $this->belongsTo(User::class);
    }

    public function scopeFilter($query, $filters){

        if($month =$filters['month']){
//            
            $query->whereMonth('created_at', Carbon::parse($month)->month);
        }

        if($year = $filters['year']){

            $query->whereYear('created_at',$year );
        }
    }

    public static function archives(){
        return static:: selectRaw('year(created_at)year, monthname(created_at)month, count(*) published')
       ->groupBy('year','month')
       ->orderByRaw('min(created_at) desc')
       ->get()
       ->toArray();
    }

    public function tags(){

        return $this->belongsToMany(Tag::class);
    }



}

4 个答案:

答案 0 :(得分:3)

根据评论和讨论,您有几个问题。原始MassAssignmentException是由于您有一个自定义基本模型,您可以在其中为所有模型定义单个$fillable属性。但是在扩展Tag模型时,您仍然引用了默认的Eloquent模型。

然后下一个问题是将标签贴在帖子上。您正在传递空格分隔的标记值,并且您在访问时计划将它们分开。当你使用多对多关系时,这不是标签的工作方式。您需要在存储之前拆分标签,并将每个标签附加到帖子上。

public function store(Request $request)
{
    $this->validate($request, [
        'title' => 'required|max:48',
        'body' => 'required',
        'image' => 'required',
        'tags' => 'required|max:200'
    ]);

    $destination = 'uploads';
    $image = $request->file('image');
    $filename = $image->getClientOriginalName();
    $image->move($destination, $filename);
    $location = $destination . '/' . $filename;

    $post = Post::create([
        'title' => request('title'),
        'body' => request('body'),
        'user_id' => auth()->id(),
        'image' => $location
    ]);

    $tags = explode(' ', request('tags'));

    $tagInstances = [];

    foreach($tags as $tag) {
        $tagInstances[] = new Tag(['name' => $tag]);
    }

    $post->tags()->saveMany($tagInstances);

    return redirect('/blog');
}

答案 1 :(得分:1)

我解决了这个异常,当你没有在每个模型中单独定义$ table和$ fillable时抛出此异常。

protected $ table ='table_name';

protected $ fillable = [您在表格中定义的字段];

访问https://laravel.com/docs/5.0/eloquent#mass-assignment然后您就可以清楚地了解这个

答案 2 :(得分:0)

第1步: 检查您的模型和数据库。如果Tag结构表具有列名,请参阅Tag结构表。

第2步: 要使用Eloquent::create插入数据,您需要创建一个名为fillable的变量,在该变量中传递要在表中创建的字段。看一下这个例子:

class Flight extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name'];
}

您可以在数据库中插入,可以使用其他方法插入  这就是这样的事情

$your_table = new YourTable();
$your_table->attr = "hello world";
$your_table->save();

此外,您不需要创建变量新帖子和电话Post::create。您只能拨打Post::create

请参阅Laravel Eloquent doc:https://laravel.com/docs/5.4/eloquent

答案 3 :(得分:0)

宣布 受保护的$ fillable = [&#39;第1列&#39;,&#39;第2列&#39;];

$ fillable变量用于创建方法以检测数据。 如果使用create方法插入数据,则必须在模型类

中指定$ fillable变量

在$ fillable变量中,指定要允许在表

中插入数据的特定列

我认为你的问题在

  1. 您不是声明$ fillable变量或
  2. 您没有在$ fillable中指定要插入的列。