web-dev-qa-db-ja.com

Laravel Eloquent $ model-> save()保存していないがエラーなし

Postモデルを更新するとき、次を実行します。

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

$post->save();
_

これは私の投稿をnot更新しません。 Laravel Eloquentモデルの更新に関するドキュメントに従っているのはなぜですか?

Postモデル:

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

   ....
}
_

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

ボーナス情報

dd($post->save())を実行すると、trueが返されます。

ランニング

_$post->save();

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

_$fetchedPost_が以前と同じ投稿であることを示していますwithout更新されたデータ。

14
Jacob

「id」列が大文字の「ID」である場合は、データベーステーブルを確認してください。小文字に変更すると、save()メソッドが機能するようになりました。

Laravel 5.5 laravelには検証メカニズムが変更されているので、この方法を試してみる必要があると思います。

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

私は同じ問題を抱えていて、モデルを取得する方法を変えることで解決しました!

あなたが言及したようにすべてがおそらく機能していたにもかかわらず、保存していませんでした:

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

これは機能しています:

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

私は同じことをしていて、主キーなしで出力列をフィルタリングしていたことが判明しました。

$rows = MyModel::where('...')->select('col2', 'col3')->get();
foreach($rows as $row){
    $rows->viewed = 1;
    $rows->save();
}

で修正

$rows = MyModel::where('...')->select('primary_key', 'col2', 'col3')->get();

主キーが使用可能でない場合、更新コマンドはNullになります。

2
Mark Walker

私の経験では、dbからEloquentモデルを選択し、_primary_key_列がフェッチされた列の一部ではない場合、$model->save()はtrueを返しますが、データベースには何も保持されません。

したがって、\App\Users::where(...)->first(['email'])を実行する代わりに、\App\Users::where(...)->first(['id','email'])を実行します。ここで、idはターゲットテーブルで定義された_primary_key_です。

いくつかの列のみを取得することで達成される(場合によってはマイクロ最適化)があまり重要でない場合は、\App\Users::where(...)->first()を実行することですべての列を取得できます。この場合、気にする必要はありません。すべての列がフェッチされるため、_primary_key_列の名前。

0

私は同じ問題を経験しており、回避策を見つけました。 _home.blade.php_テンプレートのsave()という関数内でモデルを{{ generateUrl() }}できないことがわかりました。うまくいったのは、save()呼び出しをreturns _home.blade.php_テンプレートのコントローラーに移動することでした。 (つまり、ビューがreturnedになる前にsave() ingし、{{ generateUrl() }}内で読み取り操作のみを実行します。)

ページの読み込み時にURLを挿入するstateを生成していました(そして現在):

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

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

以下は機能しなかったものです

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

これは、データベースからfind()Userできましたが、save()戻すことはできませんでした。エラーは発生していません。関数は、Userstateを後で読み取ろうとして、URLのstateと一致しないことが判明するまで、正常に動作するように見えました。

これが機能したものです。

ページがアセンブルされているときにsave() my Userを試みる代わりに、statesave() dを生成し、ページをレンダリングしました。

_// routes/web.php

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

ルートディレクトリに到達すると、_HomeController.php_のindex()関数に移動します。

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

次に、URLを生成するときに、save()Userを使用する必要はなく、そこから読み取るだけでした。

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

これはうまくいきました!唯一の違い(私が見る限り)は、ページアセンブリ中とは対照的に、ページアセンブリの前にモデルをsave() ingしているということです。

0
Cameron Hudson

これを試して

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