やりたいこと
manage_files テーブルに管理対象のファイルが置かれており、
それをcontentsテーブルから参照する構造にしています。
PHP
1class ManageFile extends Model { 2~~略 3} 4 5class Content extends Model { 6 public function file() { 7 return $this->hasOne(ManageFile::class); 8 } 9} 10 11$content = Content::findOrFail(1);
現在、 ID=1 というManageFileオブジェクトを参照しているContentがあったとして、
それを ID=2 というManageFileに切り替えたいのですが、それはどのようにしたらよいのでしょうか。
ManageFileは別にファイルアップロード機能からアップロードされるため、
レコードには既に存在しており、あくまでその参照を切り替えたいです。
現状の実装と問題
PHP
1$content = Content::findOrFail(1); // Contentをロード(この時点で $content->file はID=1です) 2$newFile = ManageFile::findOrFail(2); 3 4$content->fill( 5 'code' => $newFile->id, 6)->save();
現状の実装だと、確かに $content->code は 2 になるのですが、
メモリ上のオブジェクトの参照は変わっていません。
つまり、$content->file->code は 1 のままになっています。
試してみた解決法
上記のコードの後で、下記のように実装すると、
$content->file->code は 2 になりますが、明らかに冗長なコードですよね。。。
PHP
1$content = Content::findOrFail(1); // Contentを再度ロードし直す
色々と調べると、下記のように解説しているサイトもありますが、
これだと ID=1 のManageFile自体を更新してしまうと思っています。
PHP
1$content->file()->update($newFile);
もっとスムーズに、hasOneの参照先を切り替える方法を教えていただければ幸いです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。