web-dev-qa-db-fra.com

Laravel Eloquent $ model-> save () pas enregistrer mais pas d'erreur

Lors de la mise à jour de mon modèle Post, je lance:

$post->title = request('title');
$post->body = request('body');

$post->save();

Ceci met pas mettre à jour mon message. Mais il devrait selon les Laravel docs sur la mise à jour des modèles Eloquent . Pourquoi mon modèle n'est-il pas mis à jour?

modèle Post:

class Post extends Model
{
    protected $fillable = [
        'type',
        'title',
        'body',
        'user_id',
    ];

   ....
}

contrôleur Post:

public function store($id)
{
    $post = Post::findOrFail($id);

    // Request validation
    if ($post->type == 1) {
        // Post type has title
        $this->validate(request(), [
            'title' => 'required|min:15',
            'body' => 'required|min:19',
        ]);

        $post->title = request('title');
        $post->body = request('body');
    } else {
        $this->validate(request(), [
            'body' => 'required|min:19',
        ]);

        $post->body = request('body');
    }

    $post->save();

    return redirect('/');
}

Informations sur les bonus

L'exécution de dd($post->save()) renvoie true.

Fonctionnement

$post->save();

$fetchedPost = Post::find($post->id);
dd($fetchedPost);

me montre que $fetchedPost est le même message qu'avant sans les données mises à jour.

10
Jacob

Vérifiez votre table de base de données si la colonne 'id' est en majuscule 'ID'. Le changer en minuscule a permis à ma méthode save () de fonctionner.

Depuis Laravel 5.5 Laravel ont changé certains mécanismes de validation, je suppose que vous devez essayer de cette façon.

public function store(Request $request, $id)
{
    $post = Post::findOrFail($id);

    $validatedData = [];

    // Request validation
    if ($post->type == 1) {
        // Post type has title
        $validatedData = $request->validate([
          'title' => 'required|min:15',
          'body' => 'required|min:19',
      ]);
    } else {
      $validatedData = $request->validate([
        'body' => 'required|min:19',
    ]);
    }

    $post->update($validatedData);

    return redirect('/');
}
3
Moeen Basra

J'ai eu le même problème et changer la façon dont je récupère le modèle a résolu le problème! 

N'économisait pas même si tout était censé fonctionner exactement comme vous l'avez mentionné:

$user = User::find($id)->first(); 

Cela fonctionne:

$user = User::find($id);
1
Bardiya B.

J'ai connu le même problème et j'ai trouvé une solution de contournement. J'ai constaté que je ne pouvais pas save() mon modèle dans une fonction appelée {{ generateUrl() }} sur mon modèle home.blade.php. Ce qui a bien fonctionné a été de déplacer l'appel save() vers le contrôleur qui returns le modèle home.blade.php. (IE, save()ing avant la vue est returned, alors n'effectuez que des opérations de lecture dans {{ generateUrl() }}.)

J'étais (et suis) en train de générer une state pour mettre une URL lors du chargement de la page:

<!--views/home.blade.php-->

<a href="{{ EveAuth::generateUrl() }}">Add Character</a>

Ci-dessous ce qui n'a pas fonctionné.

// Providers/EveAuth.php

function generateUrl()
{
    $authedUser = auth()->user();
    if (!$authedUser) {
        return "#";
    }
    $user = User::find($authedUser->id);
    $user->state = str_random(16);
    $user->save();

    $baseUrl = 'https://login.eveonline.com/oauth/authorize?state=';

    return $baseUrl . $user->state;
}

Cela a permis de find() la User de la base de données, mais il a été impossible de save() de la récupérer. Aucune erreur n'a été produite. La fonction semblait fonctionner correctement ... jusqu'à ce que j'essaie de lire la variable User de state plus tard et de constater qu'elle ne correspondait pas à la variable state de l'URL.

Voici ce qui a fonctionné.

Au lieu d'essayer de save() ma User pendant l'assemblage de la page, j'ai généré la state, save()d, puis j'ai rendu la page:

// routes/web.php

Route::get('/', 'HomeController@index');

Atterrir au répertoire racine vous envoie à la fonction index() de HomeController.php:

// Controllers/HomeController.php

public function index()
{
    $authedUser = auth()->user();
    if ($authedUser) {
        $user = User::find($authedUser->id);
        $user->state = str_random(16);
        $user->save();
    }
    return view('home');
}

Ensuite, lors de la génération de l'URL, je n'avais pas à save() la User, seulement à lire:

// Providers/EveAuth.php

function generateUrl()
{
    $authedUser = auth()->user();
    $user = User::find($authedUser->id);

    $baseUrl = 'https://login.eveonline.com/oauth/authorize?state=';

    return $baseUrl . $user->state;
}

Cela a fonctionné! La seule différence (à ce que je vois) est que je suis save()ing le modèle avant que la page ne commence à être assemblée, par opposition à celle pendant la page assemblée.

0
Cameron Hudson

Essaye ça 

public function store($id,Request $request)
{
    $post = Post::findOrFail($id);

    // Request validation
    if ($post->type == 1) {
        // Post type has title
         $request->validate([
            'title' => 'required|min:15',
            'body' => 'required|min:19',
        ]);
        $post->update([
              'title' => request('title');
              'body' => request('body');
             ]);
    } else {
         $request->validate([
            'body' => 'required|min:19',
        ]);

        $post->update([
              'body' => request('body');
             ]);
    }

    return redirect('/');
}
0
MalemScha