質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

3753閲覧

FuelPHP has_many_relationshipでの削除処理について

ctsubasa

総合スコア118

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2014/08/04 14:54

FuelPHPについて質問です。

has_many_relationship上に、以下のようなオブザーバがあります。

Articleにはたくさんのコメントがあり、さらにその中には、起動されたオブザーバがあります。

以下のようなものです。

class Observer_Comments { public function before_delete($model) { Log::info("コメントを削除しました"); } public function before_update($model) { Log::info("コメントを更新しました"); } }

Articleモデルを以下のように更新すると…

$article = Article::find(1)->related('comments); unset($article->comments[1]); $article->save();

ログには何も出てきません。コメントは削除され、Article(オブザーバの動作を含む)はちゃんとアップデートされています。

コメントをちゃんと削除すると…

$comment = Comment::find(1); $comment->delete();

ログは思ったとおりの表示をします。

cascade設定をどうにかしないといけないんでしょうか?

さらに、Model::save()内に以下のコードがありました。

if (method_exists($rel, 'delete_related')) { $rel->delete_related($this); }

delete_relatedメソッドを、ArticleやCommentsモデルに追加する必要があるんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

unset()は、関連オブジェクトを削除するのではなく、2つのオブジェクトの間のリレーションを解除します。

多くの場合、それは2つのオブジェクトをリンクする(結合テーブル上にある)レコードを削除するという意味です。

その他のリレーションの場合は、外部キーがNULLにリセットされるということを意味します。

どちらの操作も、データやオブジェクトには変更を加えません。

よって、オブジェクト上でUPDATEがトリガーされることはなく、オブザーバが呼び出されることもありません。

"cascade"とは、オブジェクトを削除する場合に、その削除が関連オブジェクトを "cascade"し、さらにそれを削除するという意味です。

ただ、親をリレーションで削除する場合に限られます。

アンセット(何も削除されるものがない)は含まれません。

詳しくはマニュアルを参照してください。
http://fuelphp.jp/docs/1.7/packages/orm/relations/has_many.html#/has_many

投稿2014/08/05 02:30

gorigorigori

総合スコア71

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問