tag style img example yii2 relational-database yii2-model

style - Yii2 cómo verificar si dos modelos ya están vinculados



yii2 html img (3)

Tengo dos modelos relacionados a través de una tabla de unión.

$model->link() es el método utilizado para establecer la relación entre los dos modelos. Básicamente, rellena la tabla de unión con las teclas correspondientes de ambos modelos.

Si dos modelos están vinculados e intento vincularlos de nuevo, habrá un error porque el par de claves ya existe en la tabla de unión. Entonces necesitaría verificar si esta relación existe antes de intentar vincular los modelos.

Creo que podría simplemente crear un modelo para la tabla de unión y consultar el registro adecuado. El resultado de esa consulta diría si necesito realizar el enlace.

La pregunta es:

¿Hay alguna manera corta y fácil de realizar esta verificación, usando algún método yii incorporado?


Creo que la manera más fácil es simplemente llamar al método de relación. Con el modelo Foo y el método de relación para el modelo Bar getBar () (definido con via junction table) (nuevo Foo) -> bar es nulo si no hay ningún enlace. Por supuesto, esto es válido en caso de relación uno-a-uno. Para uno-a-muchos, tienes que verificar la matriz de resultados.


ActiveQuery tiene el método exists() que hace lo que necesita. Supongamos que tiene una clase Book que está vinculada a la clase Author . Así que Book tiene el método getAuthor() . A continuación, le mostramos cómo averiguar si existe un registro relacionado:

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

Tenga en cuenta que $book->author devuelve una instancia de Author (o una matriz si tiene una relación hasMany ), mientras que getAuthor() devuelve una instancia de ActiveQuery .

La ejecución de exists() sigue ejecutando una consulta SQL como lo haría $book->author , pero esa consulta es más eficiente que buscar los datos y crear el modelo correspondiente.

Por otro lado, en muchos casos la mejora en el rendimiento es insignificante, por lo que puede ejecutar isset($book->author) y terminar con esto.


Agregué este método al modelo que debe vincularse (en mi caso, es una relación de muchos a muchos):

/** * @inheritdoc */ public function link($name, $model, $extraColumns = []) { $exists = $this->getJunctionModel() ->where([''other_model_id'' => $model->primaryKey]) ->exists(); if (!$exists) { parent::link($name, $model, $extraColumns); } }