1. アソシエーションモデルを定義する
Laravel では、次のモデルを定義することでアソシエーションクエリを完成させることができます。
class MyPost extends Eloquent { public function myPostInfo () { return $this->hasOne('MyPostInfo'); } } class MyPostInfo extends Eloquent {}
2. 関連付けモデルを使用します
ここでは、myPostInfo()
は Camel 命名規則を使用しますが、特定の PostInfo を読み取るときに Snake 規則を使用できます。次のコードは実行可能です: myPostInfo()
用的是Camel命名规则,但是我们在读取某一个PostInfo的时候可以用Snake规则。如下面代码都是可行的:
$post = MyPost::find(1); $post_info = $post->myPostInfo; // example 1 $post_info = $post->my_post_info; // example 2
Laravel允许上述两种方法,但是没有合理的处理使用两种命名造成的冲突。
3. 缓存失效
如果我们同时使用了上述两个例子,就会使其中一个缓存失效。在Model的relations变量中,缓存了已经读取过的关联Model,但是当我们用不同规则的名字去读取的时候,却会使得前一个缓存失效。例如
$post_info = $post->myPostInfo; // $post->relations = [‘myPostInfo’ => ..]; $post_info = $post->my_post_info; // $post->relations = [‘myPostInfo’ => …, ‘my_post_info’ => …];
所以如果不希望缓存失效,得在项目中只使用一种命名方法去读取关系模型。Laravel推荐的是Camel Case.
4. toArray() 方法失效
如果同时使用了两者,另外一个问题就是导致Model::toArray()
失效。因为toArray()
方法首先去relations
中查找Snake Case命名的关联模型,没有的话才去看Camel Case的。
所以如果用到了toArray()
MyPost::with(‘myPostInfo’)->get();Laravel は上記の 2 つのメソッドを許可しますが、2 つの命名メソッドの使用によって生じる競合を合理的に処理しません。 3. キャッシュの無効化上記の 2 つの例を同時に使用すると、どちらかのキャッシュが無効になります。 Modelのrelationship変数には読み込んだ関連Modelがキャッシュされていますが、ルールが異なる名前で読み込んだ場合、以前のキャッシュは無効になってしまいます。たとえば、
$my_post->myPostInfo;したがって、キャッシュの有効期限が切れたくない場合は、プロジェクト内でリレーショナル モデルを読み取る名前付けメソッドを 1 つだけ使用する必要があります。 Laravel は Camel Case を推奨しています4. toArray() メソッドは無効です両方を同時に使用すると、
Model::toArray()
が無効になるという別の問題があります。なぜなら、toArray()
メソッドは最初に relations
でスネーク ケースという名前の関連付けモデルを検索し、見つからない場合はキャメル ケースを調べます。 そのため、toArray()
メソッドを使用してモデルを変換する場合は、両方を同時に使用しないでください。 🎜🎜5. 犯しやすい間違い🎜🎜 最も犯しやすいコードは次のとおりです: 🎜rrreee🎜 With をeagerLoad に使用してモデルを関連付ける場合、定義メソッドと同じ名前のキーを使用する必要があります。読むので、こう読むとキャメルケースのキーにしかなりません。他の場所では、問題がないことを確認するために 🎜rrreee🎜 のみを使用できます。 🎜
🎜
以上、Laravelのアソシエーションモデルにおける名前の一貫性によって引き起こされる問題について、laravelの内容も含めて紹介しましたので、PHPチュートリアルに興味のある友人の参考になれば幸いです。 🎜
🎜
🎜