2010-02-04 4 views
3

Supposons qu'il existe deux tables.Est-ce possible de joindre des tables dans doctrine ORM sans utiliser de relations?

Table X-- 
Columns: 
    id   x_value 

Table Y-- 
Columns: 
    id  x_id  y_value 

Maintenant, je ne veux pas définir la relation dans les classes de doctrine et je veux récupérer des enregistrements à l'aide de ces deux tableaux en utilisant une requête comme ceci:

Select x_value from x, y where y.id="variable_z" and x.id=y.x_id; 

Je suis pas en mesure de comprendre comment écrire requête comme ceci dans la doctrine ORM

EDIT:

structures Tableau:

Tableau 1:

CREATE TABLE IF NOT EXISTS `image` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
`random_name` varchar(255) NOT NULL, 
`user_id` int(11) NOT NULL, 
    `community_id` int(11) NOT NULL, 
    `published` varchar(1) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=259 ; 

Tableau 2:

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `city` varchar(20) DEFAULT NULL, 
    `state` varchar(20) DEFAULT NULL, 
    `school` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ; 

Recherche J'utilise:

 $q = new Doctrine_RawSql(); 

     $q ->select('{u.*}, {img.*}') 
     ->from('users u LEFT JOIN image img ON u.id = img.user_id') 
     ->addComponent('u', 'Users u') 
     ->addComponent('img', 'u.Image img') 
     ->where("img.community_id='$community_id' AND img.published='y' AND u.state='$state' AND u.city='$city 
     ->orderBy('img.id DESC') 
     ->limit($count+12) 
     ->execute();   

erreur que je reçois:

Fatal error: Uncaught exception 'Doctrine_Exception' with message 'Couldn't find class 
u' in C:\xampp\htdocs\fanyer\doctrine\lib\Doctrine\Table.php:290 Stack trace: #0 
C:\xampp\htdocs\fanyer\doctrine\lib\Doctrine\Table.php(240): Doctrine_Table- >initDefinition() #1 C:\xampp\htdocs\fanyer\doctrine\lib\Doctrine\Connection.php(1127): 
Doctrine_Table->__construct('u', Object(Doctrine_Connection_Mysql), true) #2 
C:\xampp\htdocs\fanyer\doctrine\lib\Doctrine\RawSql.php(425): Doctrine_Connection- 
>getTable('u') #3 C:\xampp\htdocs\fanyer\doctrine\models\Image.php(33): Doctrine_RawSql- 
>addComponent('img', 'u.Image imga') #4 C:\xampp\htdocs\fanyer\community_images.php(31): 
    Image->get_community_images_gallery_filter(4, 0, 'AL', 'ALBERTVILLE') #5 {main} thrown  in 
    C:\xampp\htdocs\fanyer\doctrine\lib\Doctrine\Table.php on line 290 

Répondre

2

Essayez quelque chose comme ceci: ---

$q = new Doctrine_RawSql(); 
$this->related_objects = $q-> 
     select('{o.name}')-> 
     from('tagset t1 JOIN tagset t2 ON t1.tag_id = t2.tag_id AND t1.object_id != t2.object_id JOIN object o ON t2.object_id = o.id')-> 
     addComponent('o','Object o')-> 
     where('t1.object_id = ?', $this->object->id)-> 
     groupBy('t2.object_id')-> 
     orderBy('COUNT(*) DESC')-> 
     execute(); 
1

Vous pouvez écrire le sql directement sur le pilote db. Cependant, vous ne récupérerez aucun tableau ou objet hydraté. Mais il ne se pratique parfois:

$sql = "SELECT * FROM... ";   
$pdo = Doctrine_Manager::connection()->getDbh();  
$data = $pdo->query($sql)->fetchAll(); 
0

Vous pouvez modifier manuellement votre table de classe dans symfony 1.4, mais cela doit être fait avec soin, parce que vous êtes ne pas relier les tables au niveau de la base de données, ce qui devrait normalement se produire.

class TableName extends BaseTableName 
{ 
    public function setUp() 
    { 
     $this->hasOne('LinkedTableName', array(
      'local' => 'link_id', 
      'foreign' => 'link_id')); 
     parent::setUp(); 
    } 
} 

double possible: doctrine join without relation

Questions connexes