4

ジャンクション テーブルを介して関連付けられた 2 つのモデルがあります。

$model->link()2 つのモデル間の関係を確立するために使用される方法です。基本的に、ジャンクション テーブルに両方のモデルの対応するキーを入力します。

2 つのモデルがリンクされている状態で再度リンクしようとすると、結合テーブルにキー ペアが既に存在するため、エラーが発生します。次に、モデルをリンクする前に、この関係が存在するかどうかを確認する必要があります。

ジャンクション テーブルのモデルを作成し、適切なレコードをクエリするだけでよいと思います。そのクエリの結果は、リンクを実行する必要があるかどうかを示します。

質問は:

いくつかの yii 組み込みメソッドを使用して、このチェックを実行する短くて簡単な方法はありますか?

4

4 に答える 4

4

ActiveQueryexists()必要なことを行うメソッドがあります。Bookクラスにリンクされたクラスがあると仮定しましょうAuthor。メソッドBookgetAuthor()同様です。関連するレコードが存在するかどうかを確認する方法は次のとおりです。

$book->getAuthor()->exists();

$book->authorのインスタンス(またはリレーションAuthorの場合は配列) を返しますが、インスタンスを返すことに注意してください。hasManygetAuthor()ActiveQuery

実行すると、exists()同じように 1 つの SQL クエリが実行$book->authorされますが、そのクエリは、実際にデータを取得して対応するモデルを作成するよりも効率的です。

一方、多くの場合、パフォーマンスの向上はごくわずかであるため、実行するだけisset($book->author)で完了できます。

于 2015-11-06T22:18:57.937 に答える