名前の一貫性によって引き起こされるLaravel関連付けモデルの問題、laravelビデオチュートリアル、thinkphp、php、laravel

WBOY
リリース: 2016-07-29 08:50:02
オリジナル
1457 人が閲覧しました

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チュートリアルに興味のある友人の参考になれば幸いです。 🎜 🎜 🎜
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!