Ich folge der Laravel Aus der Scratch-Tutorialserie. Ich bin gerade dabei, dass Sie ein Kommentarsystem für Ihr Artikelsystem erstellen. Aber ich habe ein Problem, ich weiß nicht wirklich, was der Fehler an diesem Punkt sagt.
Der Fehler:
Illuminate\Database\Eloquent\MassAssignmentException
body
Das Kommentarmodell:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
public function post()
{
return $this->belongsTo(Post::class);
}
}
Das Postmodell:
<?php
namespace App;
class Post extends Model
{
public function comments()
{
return $this->hasMany(Comment::class);
}
public function addComment($body)
{
$this->comments()->create(compact('body'));
}
}
Die Route, die ich gemacht habe:
Route::post('/posts/{post}/comments', '[email protected]');
Der Kommentar-Controller:
<?php
namespace App\Http\Controllers;
use App\Post;
class CommentsController extends Controller
{
public function store(Post $post)
{
$post->addComment(request('body'));
return back();
}
}
Danke im Voraus!
Dies ist eine Sicherheitsfunktion von Laravel. Es soll Sie vor Formmanipulationen bei der Verwendung von Massenzuweisungen schützen.
Beispiel für ein Anmeldeformular: Wenn sich in Ihrer Datenbank eine is_admin
-Spalte befindet, kann ein Benutzer einfach Ihr Formular bearbeiten, um is_admin
auf true
auf Ihrem Server und somit in Ihrer Datenbank festzulegen. Dieses Sicherheitsfeature verhindert dies, indem es eine Whitelist verwendet, um sichere Felder zu definieren.
Sie müssen eine $fillable
-Eigenschaft für Ihr Modell festlegen. Der Wert muss ein Array sein, das alle Felder enthält, die massenzuweisbar sind (wie Benutzername, E-Mail-Adresse, ...).
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
# This property!
protected $fillable = ['body'];
// ...
}
Siehe "Massenzuordnung" in den Dokumenten: https://laravel.com/docs/5.5/eloquent#mass-assignment
Bei der Massenzuweisung wird ein Array an die Modellerstellung gesendet. Dabei werden im Wesentlichen mehrere Felder des Modells in einem einzigen Durchgang festgelegt, und nicht eines nach dem anderen.
public function addComment($body)
{
$this->comments()->create(compact('body'));
}
Sie müssen das Feld, das Sie ausfüllen, zu dem ausfüllbaren Array in Comments.php
model hinzufügen:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
protected $fillable = ['body'];
public function post()
{
return $this->belongsTo(Post::class);
}
}
Wie in der Dokumentation heißt es:
Sie können die create-Methode auch verwenden, um ein neues Modell in einem einzelnen .__ zu speichern. Linie. Die eingefügte Modellinstanz wird Ihnen von .__ zurückgegeben. Methode. Zuvor müssen Sie jedoch entweder ein .__ angeben. Füllbares oder geschütztes Attribut im Modell, wie bei allen Eloquent-Modellen standardmäßig gegen Massenzuordnung schützen.
Hoffe das hilft dir.