Hinzufügen von Daten auf mehrere Tabellen mit einem einzigen Formular Laravel
Ich versuche das einfügen eines blog-post auf die db, ich habe zwei Tabellen posts und tags, Tabellen. Wenn ich einfügen das erstellen des post möchte ich einfügen zu können die Daten aus dem Formular in den zwei verschiedenen Tabellen.
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>
Auf meiner route-Datei habe ich den Pfad, der führt zu PostsController.php die eine Speicher-Methode wie folgt:
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');
}
}
Der Sache ist, dass wenn ich die Methode aufrufen, ich will die Daten des Formulars gespeichert werden, die auf zwei verschiedene Tabellen, die ich versucht habe wie unten aber ich erhalte FEHLER:
MassAssignmentException in Model.php Linie 232:
name
Habe ich das Problem untersuchen, aber kein Glück; und ja, ich habe die Namen aufgelistet, die in den protected $fillable array. Irgendwelche Vorschläge, wie zum speichern der Daten in zwei unterschiedlichen Tabellen oder welche Art von Beziehung sollte ich verwenden.
Auf post.php Modell habe ich eine Beziehung angegeben. Tags belongsToMany als auch auf meinem tag.php Modell Post belongsToMany
p.s Neue zu Laravel.
tag.php Modell:
<?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 Modell:
<?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);
}
}
- Kann man
dd($tags);
und poste das Ergebnis. Ich muss sehen, dass das tag-format übergeben Sie aus der form. Auch sollten Sie nicht erstellen Sie die tags so, wenn Sie eine Beziehung haben. Teilen Sie Ihre Post-und Tag-Modell zusammen mit der Struktur der Tabelle. Ich zeige Ihnen, wie Sie dieses Recht tun. - Ich habe getan, dd bekomme ich die tags als string (ja, das ist, wie ich Sie einfügen möchten, um es später werde ich str_replace) brauche ich nur, um es gleich jetzt. Ja, ich werde Sie hinzufügen.
- Teilen Sie einfach Ihre Wert bitte. Sie arbeiten mit Beziehungen hier, also müssen Sie aufgeteilt werden die tags richtig und dann erstellen Sie Sie, und befestigen Sie es an die post.
- überprüfen Sie es jetzt. Sie sind da
- Die Modelle sehen gut aus, außer Sie sind nicht die
$fillable
Eigenschaft. Ohne die Ihr create-Aufruf über das Modell nicht funktionieren. Haben Sie es während der Buchung oder tun Sie es nicht haben in Ihrem Modell? Auch der Wert des tag-Feld aus dem Formular. - Ich habe die $fillable Methode auf meine Eltern-model-Klasse; ich habe meine eigenen Model-Klasse und die ausfüllbare variable deklariert, die Klasse.
- Lassen Sie uns weiter, diese Diskussion im chat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf die Kommentare und Diskussion, Sie haben ein paar Fragen. Die original
MassAssignmentException
war aufgrund der Tatsache, dass Sie haben eine eigene Basis-Modell, in dem Sie definieren einen einzigen$fillable
Eigenschaft für alle Modelle. Aber Sie immer noch auf die Standard-Eloquent-Modell bei der Erweiterung IhrerTag
Modell.Dann das nächste Problem wäre die Anbringung der tags auf die post. Sie vorbei sind Leerzeichen-getrennte tag-Wert und Sie planen, Sie zu trennen, wenn Zugriff auf. Das ist nicht, wie tags funktionieren, wenn Sie zu viele-zu-viele-Beziehung. Sie müssen sich teilen Sie die tags, bevor Sie speichert Sie und befestigen Sie einander in die post.
Ich dieses Problem lösen Ausnahme, und diese Ausnahme wirft, wenn Sie nicht definieren $Tabelle und $fillable in Ihr jedes Modell separat.
protected $table = 'table_name';
protected $fillable = [Felder, die Sie definieren in der Tabelle];
besuchen https://laravel.com/docs/5.0/eloquent#mass-assignment dann können Sie sich ein klares Verständnis über diese
Einfach erklären
Protected $fillable =['Spalte 1','Spalte 2'];
$fillable variable Nutzung für create-Methode für insterting Daten.
Wenn Sie mit create-Methode zum einfügen von Daten, dann müssen Sie $fillable variable in Modell-Klasse
In $fillable Variablen, die Sie angeben, eine bestimmte Spalte, die Sie zulassen möchten, zum einfügen von Daten in Tabelle
Ich denke, Ihr Problem in
Schritt 1:
Überprüfen Sie Ihr Modell und Datenbank. Sehen Sie die Tag-Struktur Tabelle, wenn die Spalte name.
Schritt 2:
Zum einfügen von Daten mit
Eloquent::create
müssen Sie eine variable erstellen namensfillable
, in der Sie passieren die Felder, die Sie möchten in Ihrer Tabelle. Schau dir das Beispiel an:Mit, die Sie einfügen können, die in Ihrer Datenbank, die Sie verwenden können, anderen Ansatz zu legen
das geht so etwas wie dieses
Außerdem müssen Sie nicht brauchen, um die variable zu erstellen neuen Beitrag und nach dem Anruf
Post::create
. Sie können den Anruf nurPost::create
.Finden Sie in der Laravel Eloquent doc: https://laravel.com/docs/5.4/eloquent