Su pregunta y los detalles de la pregunta cubren dos contextos completamente diferentes.
Para responder a su pregunta, no existe lo mejor. Es una pregunta subjetiva que dará como resultado respuestas basadas en las opiniones de las personas.
Con respecto a su preocupación por los bloqueos y los alias de la tabla, con Yii, no estoy seguro de cómo está escribiendo su código para realizar los bloqueos de la tabla. Si necesita obtener el alias de una tabla, simplemente puede usar:
- ¿Debo usar Vue.js, en lugar de React.js, para mis aplicaciones web, y si es así, por qué?
- Parece que Spring 5 se está alejando de la aplicación web convencional, ya que sus tutoriales para aplicaciones web siguen usando Spring Boot. ¿Por qué?
- ¿Hay algún tipo de servicio web para el que Ruby on Rails sea muy adecuado?
- ¿Cuáles son las ventajas de SSD VPS frente a SSD VPS en el alojamiento de una aplicación web?
- ¿Cómo funciona el algoritmo de Pandora?
$alias = $this->getTableAlias(false, false);
Al no usar el valor devuelto por getTableAlias () , Yii automáticamente usará t como el nombre de alias de la tabla, causando conflictos y ambigüedad. Este es un problema común que enfrentan algunos desarrolladores al definir un valor predeterminado de Alcance () para las tablas que contienen los mismos nombres de campo / columna.
Si está utilizando Active Record, puede hacer lo siguiente:
clase MyModel extiende ActiveRecord {
…
función pública beforeSave () {
Yii :: app () -> db-> createCommand (“LOCK TABLE` {$ this-> tableName} `WRITE;”) -> execute ();
return parent :: beforeSave ();
}
función pública afterSave () {
Yii :: app () -> db-> createCommand (‘UNLOCK TABLES;’) -> execute ();
parent :: beforeSave ();
}
…
}
En otros casos, su consulta puede necesitar incluir tanto el nombre de la tabla como el alias como en este ejemplo:
$ alias = $ this-> getTableAlias (falso, falso);
Yii :: app () -> db-> createCommand (“LOCK TABLES` {$ this-> tableName} `WRITE,` {$ this-> tableName} `AS` {$ alias} `WRITE;”) -> execute ();
Supongo que estás intentando bloquear una tabla y sus tablas relacionadas. Si es así, puede extender los métodos beforeSave () y afterSave () en los modelos que deben bloquearse. Si no siempre necesita que las tablas relacionadas se bloqueen en los eventos de guardar antes y después, lo que puede hacer es bloquear las tablas relacionadas al llamar a beforeSave () desde la primera tabla que está bloqueada. Por ejemplo, usando una combinación de los ejemplos segundo y tercero anteriores:
clase MyModel extiende ActiveRecord {
…
función pública beforeSave () {
$ alias = $ this-> getTableAlias (falso, falso);
$ table_name = $ this-> tableName;
Yii :: app () -> db-> createCommand (“LOCK TABLES` {$ table_name} `WRITE,` {$ table_name} `AS` {$ alias} `WRITE;”) -> execute ();
$ relaciones = array_keys ($ this-> relations ());
foreach ($ relaciones como $ relación) {
$ this -> $ relacion-> setTableAlias ($ relacion);
$ table_name = $ this -> $ relacion-> tableName;
Yii :: app () -> db-> createCommand (“LOCK TABLES` {$ table_name} `WRITE,` {$ table_name} `AS` {$ relacion} `WRITE;”) -> execute ();
}
return parent :: beforeSave ();
}
función pública afterSave () {
Yii :: app () -> db-> createCommand (‘UNLOCK TABLES;’) -> execute ();
parent :: beforeSave ();
}
…
}
Ahora, sin comprender completamente el problema que enfrenta, lo que ha intentado y su enfoque para realizar los bloqueos de la mesa, es difícil proporcionar una solución sólida, pero espero que esto lo guíe en la dirección correcta.
DESCARGO DE RESPONSABILIDAD: Todavía no probé este código. Puede contener errores de sintaxis o puede requerir un poco de limpieza.
EDITAR: Actualicé mi último ejemplo de código basado en la información encontrada aquí:
http://www.yiiframework.com/foru…
Parece bastante tonto que el alias de las tablas relacionadas no se establezca automáticamente cuando se genera la consulta, como sucede con los ámbitos de Yii.