php - udemy - Zend Framework: ¿forma correcta de interactuar con la base de datos?
zend framework 2018 (3)
En general, las personas prefieren acceder a la base de datos a través de los objetos Tabla y Fila, para que coincida con sus hábitos de programación orientada a objetos.
El enfoque OO es útil si necesita escribir código para transformar o validar entradas o salidas de consulta. También puede escribir métodos personalizados en una clase de tabla o fila para encapsular las consultas que se necesitan con frecuencia.
Pero la interfaz orientada a objetos está simplificada, no puede realizar todos los tipos de operaciones de base de datos que pueda necesitar hacer. De modo que puede profundizar y ejecutar una consulta SQL en contra de los métodos Zend_Db_Adapter como query()
y fetchAll()
cuando se requiere un control más preciso sobre su SQL.
Esto es bastante común para interfaces orientadas a objetos a bases de datos. Una capa OO que podría duplicar cada característica SQL sería increíblemente compleja. Por lo tanto, para llegar a un compromiso, una capa OO generalmente trata de proporcionar formas sencillas de realizar las tareas más comunes, al tiempo que le brinda la posibilidad de pasar por debajo de las coberturas cuando sea necesario.
Esa es una respuesta muy general a tu pregunta general.
Soy bastante nuevo en Zend Framework y MVC y estoy un poco confundido con Zend_DB y la forma correcta de interactuar con la base de datos.
Estoy usando el adaptador PDO MySQL y he creado algunas clases para extender las clases abstractas:
class Users extends Zend_Db_Table_Abstract {
protected $_name = ''users'';
protected $_primary = ''user_id'';
protected $_rowClass = ''User'';
public function getUserbyID($id) { /* code */ }
// More code here
}
class User extends Zend_Db_Table_Row_Abstract {
// Code here
}
class Widgets extends Zend_Db_Table_Abstract {
protected $_name = ''widgets'';
protected $_rowClass = ''Widget'';
public function getWidgetsfromUser($userid) { /* code */ }
// More code here
}
class User extends Zend_Db_Table_Row_Abstract {
public function doSomethingWithWidget() { /* code */ }
// More code here
}
Parece haber tantas formas de acceder al DB (fetchAll (), find (), fetchAll () a través del adaptador, insert (), createRow () y save (), select () objeto) que siempre me encuentro retrocediendo a los doctores para descubrir lo que debería estar haciendo.
SO me ha enseñado que las declaraciones preparadas son el camino a seguir, y he estado tratando de usar rowsets y row (¿debería ser así?), Pero todavía estoy confundido sobre cuál es la mejor forma de interactuar con la base de datos.
(disculpas por la pregunta terriblemente abierta)
Usando Zend_Db probablemente no desee entrar en los detalles de las declaraciones preparadas y similares. Solo quiere usar los objetos modelo para hacer CRUD básico (Crear, Leer, Actualizar y Eliminar). Sé que la Guía de referencia del programador es extensa, pero es una excelente introducción a Zend_Db. Es posible que desee echar un vistazo más de cerca a la documentación de Zend_Db_Table .
Pero para dar una respuesta rápida a tu pregunta. A menos que deba sobrescribir algún comportamiento predeterminado, no debería necesitar extender Zend_Db_Table_Row_Abstract. También probablemente puedas simplificar la clase Users para que sea solo:
class Users extends Zend_Db_Table_Abstract {
protected $_name = ''users'';
// Code here
}
Luego, para usarlo, harías algunas de las cosas que mencionaste usando lo siguiente:
//Create a Users Model Object
$usersDb = new Users();
//Find the record with user_id = 4 and print out their name
$row = $usersDb->find(4);
echo $row->first_name . '' '' . $row->last_name
//Change the first name of this user to Brian
$row->first_name = ''Brian'';
$row->update();
//Insert a user into the database
$data = array(
''first_name'' => ''Gilean'',
''last_name'' => ''Smith'');
$usersDb->insert($data);
//Retrieve all users with the last name smith and print out their full names
$rows = $usersDb->fetchAll($usersDb->select()->where(''last_name = ?'', ''smith''));
foreach ($rows as $row) {
echo $row->first_name . '' '' . $row->last_name
}
Recomiendo usar el método guardar.
//Create a Users Model Object
$usersDb = new Users();
//Find the record with user_id = 4 and print out their name
$row = $usersDb->find(4);
echo $row->first_name . '' '' . $row->last_name
//Change the first name of this user to Brian
$row->first_name = ''Brian'';
$row->save();
//Insert a user into the database
$newUser = $usersDb->fetchNew();
$newUser->first_name = ''Gilean'';
$newuser->last_name = ''Smith'';
$newUser->save();
// OR if you get your data from post or any array
$newUser = $usersDb->fetchNew();
$newUser->setFromArray($data_from_post);
$newUser->save();
El motivo por el que me gusta más este enfoque es porque este siempre tiene una instancia del modelo de usuario y puede tener métodos personalizados en ellos (por ejemplo, isAdmin) y también porque puede sobreescribir la función de guardar / insertar / actualizar en userRow hacer algo antes de que se inserten / actualicen.