I am trying to insert a blog post on db, I do have two tables posts and tags tables. When I insert the create the post I want to be able to insert the data from the form in those two different tables.
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>
On my route file I have the path that leads to PostsController.php which has a store method like below:
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');
}
}
The thing is that when I call the method I want the form data to be saved on two different tables, I have tried like below but I am getting ERROR:
MassAssignmentException in Model.php line 232: name
I did research the issue but no luck; and yes I do have the 'name' listed in the protected $fillable array. Any suggestion on how to store data in two different tables or what type of relationship should i use.
On post.php model i do have a relationship specified. Tags belongsToMany as well as on my tag.php model Post belongsToMany
p.s New to Laravel.
tag.php model:
<?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 model:
<?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);
}
}
dd($tags);and post the result. I need to see the tag format you pass from the form. Also you shouldn't create tags like that when you have a relationship. Share your Post and Tag model along with the table structure. I'll show you how to do this right. - Sandeesh$fillableproperty. Without which your create call on model won't work. Did you remove it while posting or do you not have it in your model? Also share the value of the tag field coming from the form. - Sandeesh