retrieving information from related tables with Zend Framework and Doctrine 1.2
After working hard in my ZF/Doctrine integration I'm having a problem "translating" my previous Zend_Db work into Doctrine. I used generate-models-db to create the models and I did got to access some properties form the view but only those concerning the table whose model I created like this:
$usuarios = new Model_Users();
$usr = $usuarios->getTable()->findAll();
$this->view->show = $usr;
Model_Users is related to two tables with this method:
public function setUp()
{
parent::setUp();
$this->hasMany('Model_PlanillaUsers as PlanillaUsers', array(
'local' => 'id',
'foreign' => 'users_id'));
$this->hasMany('Model_UsersHasPais as UsersHasPais', array(
'local' => 'id',
'foreign' => 'users_id'));
}
Right now I'm concerned about UsersHasPais...which tells me what pais.pais fields and which users.id entries match. This is the Model_Pais:
abstract class Model_Base_Pais extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('pais');
$this->hasColumn('id', 'integer', 4, ar开发者_JAVA技巧ray(
'type' => 'integer',
'length' => 4,
'fixed' => false,
'unsigned' => false,
'primary' => true,
'autoincrement' => true,
));
$this->hasColumn('pais', 'string', 20, array(
'type' => 'string',
'length' => 20,
'fixed' => false,
'unsigned' => false,
'primary' => false,
'notnull' => true,
'autoincrement' => false,
));
}
public function setUp()
{
parent::setUp();
$this->hasMany('Model_UsersHasPais as UsersHasPais', array(
'local' => 'id',
'foreign' => 'pais_id'));
}
}
And this is the join table:
abstract class Model_Base_UsersHasPais extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('users_has_pais');
$this->hasColumn('id', 'integer', 4, array(
'type' => 'integer',
'length' => 4,
'fixed' => false,
'unsigned' => false,
'primary' => true,
'autoincrement' => true,
));
$this->hasColumn('users_id', 'integer', 4, array(
'type' => 'integer',
'length' => 4,
'fixed' => false,
'unsigned' => false,
'primary' => false,
'notnull' => true,
'autoincrement' => false,
));
$this->hasColumn('pais_id', 'integer', 4, array(
'type' => 'integer',
'length' => 4,
'fixed' => false,
'unsigned' => false,
'primary' => false,
'notnull' => true,
'autoincrement' => false,
));
}
public function setUp()
{
parent::setUp();
$this->hasOne('Model_Users as Users', array(
'local' => 'users_id',
'foreign' => 'id'));
$this->hasOne('Model_Pais as Pais', array(
'local' => 'pais_id',
'foreign' => 'id'));
}
}
Now what I want to be able to retrieve,...if not clear enough is the fields called pais from the pais table that match with my current user id. How do I do this with Doctrine?
EDIT:
//Added to Model_Users class
public function saveUser($user) {
$this->email = $user['email'];
$this->password = crypt($user['password'], $this->_salt);
$this->url = $user['url'];
$this->responsable = $user['responsable'];
$this->role = $user['role'];
$this->fecha = Zend_Date::now()->toString('yyyyMMddHHmmss');
$id = $this->save();
}
//Users table schema
Users:
connection: 0
tableName: users
columns:
id:
type: integer(4)
fixed: false
unsigned: false
primary: true
autoincrement: true
email:
type: string(50)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
password:
type: string(250)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
url:
type: string(50)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
responsable:
type: string(50)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
role:
type: string(25)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
fecha:
type: timestamp(25)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
relations:
PlanillaUsers:
local: id
foreign: users_id
type: many
UsersHasPais:
local: id
foreign: users_id
type: many
In your controller write a query something like
$cu = current_user_id // you'll have to set this your self from a session variable etc
$q = Doctrine_Query::create()
->select('p.pais')
->from('Model_Pais p')
->leftJoin('p.Model_UsersHasPais s')
->leftJoin('s.Model_Users u')
->where('u.id = ?',$cu);
$result = $q->fetchArray();
精彩评论