Estoy usando laravel 5.5 e intento guardar los comentarios de mi publicación de blog en la base de datos. Cuando intenté esto, ¿no se guarda en la base de datos y no da ningún error?

(Agrego un nuevo comentario, hago clic en enviar, me redirecciono a la misma página. Pero no guardo el comentario en la base de datos ..)

Controlador

public function store(Request $request, $post_id)
{
    $this->validate($request, [
        'name' => 'required',
        'email' => 'required',
        'comment' => 'required'
    ]);

    $post = Post::find($post_id);

    $comment = new Comment;
    $comment->name = $request->name;
    $comment->email = $request->email;
    $comment->comment = $request->comment;
    $comment->approved = true;
    $comment->posts()->associate($post);
    $comment->save;

    return redirect()->route('post_slug',$post->slug);
}
1
user7986752 11 nov. 2017 a las 22:06

2 respuestas

La mejor respuesta

Si no tiene un comentario guardado y se le redirige a la misma página, supongo que no tiene los campos name, email o comment completados. Así es como funciona la validación: si falla, será redirigido a la URL anterior, así que asegúrese de mostrar errores de validación para ver qué está sucediendo.

EDITAR

Y una cosa más: en lugar de ->save, debes usar ->save() y mover la publicación asociada al final para que en lugar de:

$comment->posts()->associate($post);
$comment->save;

Deberías usar:

$comment->save();
$comment->posts()->associate($post);

Y probablemente sea razonable usar la transacción para guardarlos en la base de datos.

Cuando usó ->save, en realidad accedió al atributo del modelo y no ha ejecutado el guardado del modelo.

0
Marcin Nabiałek 11 nov. 2017 a las 19:32

Laravel Eloquent proporciona métodos convenientes para agregar nuevos modelos a las relaciones, cuando lo usa, con el método save () debería verse así:

$comment = new App\Comment([
'name' => $request->name,
'email' => $request->email,
'comment' => $request->comment,
'approved' => true
]);

$post = App\Post::find($post_id);
$post->comments()->save($comment);

O la forma correcta es usar el método create () que acepta una matriz de atributos, crea un modelo y lo inserta en la base de datos. Por ejemplo:

$post = App\Post::find($post_id);

$comment = $post->comments()->create([
'name' => $request->name,
'email' => $request->email,
'comment' => $request->comment,
'approved' => true
]);
0
Nikolay Kolev 7 nov. 2018 a las 07:50