it-swarm-pt.tech

Laravel Eloquent $ model-> save () não salvando, mas sem erro

Ao atualizar meu modelo Post, eu corro:

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

$post->save();

Isso faz não atualizar minha postagem. Mas deve de acordo com o Laravel docs em atualizar modelos Eloquent . Por que meu modelo não está sendo atualizado?

Post model:

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

   ....
}

Post controller:

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('/');
}

Informação de bônus

A execução dd($post->save()) retorna true.

Corrida

$post->save();

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

me mostra que $fetchedPost é o mesmo post que antes sem os dados atualizados.

10
Jacob

Verifique sua tabela de banco de dados se a coluna 'id' estiver em 'ID' maiúsculo. Alterá-lo para minúsculas permitiu que meu método save () funcionasse.

3

Desde Laravel 5.5 laravel mudaram algum mecanismo de validação, eu acho que você precisa tentar desta forma.

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

Eu tive o mesmo problema e mudando a maneira que eu busco o modelo resolvi isso! 

Não estava economizando, embora tudo estivesse supostamente funcionando como você mencionou:

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

Isso está funcionando:

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

Eu tenho experimentado o mesmo problema e encontrei uma solução alternativa. Descobri que não era possível save() meu modelo dentro de uma função chamada {{ generateUrl() }} no meu modelo home.blade.php. O que funcionou foi mover a chamada save() para o controlador que returns o modelo home.blade.php. (IE, save()ing antes que a visão seja returned, então somente realizando operações de leitura dentro de {{ generateUrl() }}.)

Eu estava (e estou) gerando um state para colocar em um URL no carregamento da página:

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

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

Abaixo está o que não funcionou.

// 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;
}

Isso foi capaz de find() o User do banco de dados, mas não foi possível save() ele de volta. Nenhum erro foi produzido. A função pareceu funcionar corretamente ... até que tentei ler o User do state mais tarde, e descobri que ele não correspondia ao state na URL.

Aqui está o que funcionou.

Em vez de tentar save() my User enquanto a página estava sendo montada, eu gerava o state, save()d, então processei a página:

// routes/web.php

Route::get('/', '[email protected]');

Aterrissar no diretório raiz envia você para a função 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');
}

Então, ao gerar o URL, eu não tive que save() o User, só li nele:

// 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;
}

Isso funcionou! A única diferença (tanto quanto eu vejo) é que eu estou save()ing o modelo antes da página de seres de montagem, ao contrário de durante a montagem da página.

0
Cameron Hudson

Tente isso 

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