Post
モデルを更新するとき、次を実行します。
_$post->title = request('title');
$post->body = request('body');
$post->save();
_
これは私の投稿をnot更新しません。 Laravel Eloquentモデルの更新に関するドキュメント 。に従っているのはなぜですか?
save
が成功したかどうかを確認するためにこのテストを実行 の結果はtrue
でした。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更新されたデータ。
「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('/');
}
私は同じ問題を抱えていて、モデルを取得する方法を変えることで解決しました!
あなたが言及したようにすべてがおそらく機能していたにもかかわらず、保存していませんでした:
$user = User::find($id)->first();
これは機能しています:
$user = User::find($id);
私は同じことをしていて、主キーなしで出力列をフィルタリングしていたことが判明しました。
$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になります。
私の経験では、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
_列の名前。
私は同じ問題を経験しており、回避策を見つけました。 _home.blade.php
_テンプレートのsave()
という関数内でモデルを{{ generateUrl() }}
できないことがわかりました。うまくいったのは、save()
呼び出しをreturn
s _home.blade.php
_テンプレートのコントローラーに移動することでした。 (つまり、ビューがreturn
edになる前に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()
戻すことはできませんでした。エラーは発生していません。関数は、User
のstate
を後で読み取ろうとして、URLのstate
と一致しないことが判明するまで、正常に動作するように見えました。
これが機能したものです。
ページがアセンブルされているときにsave()
my User
を試みる代わりに、state
、save()
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しているということです。
これを試して
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('/');
}