Est-ce possible de joindre des tables dans la doctrine ORM sans utiliser les relations?

StackOverflow https://stackoverflow.com/questions/2203027

  •  18-09-2019
  •  | 
  •  

Question

Supposons qu'il y ait deux tables.

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 ne suis pas en mesure de comprendre comment écrire la requête comme ceci dans ORM doctrine

EDIT:

Tableau structures:

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 ;

Requête 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
Était-ce utile?

La solution

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();

Autres conseils

Vous pouvez écrire le code SQL directement au db driver.You ne récupérer des tableaux ou des objets hydratés cependant. Mais il ne vient parfois en pratique:

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

Vous pouvez manuellement modifier votre table de classe dans symfony 1.4, mais cela devrait être fait avec soin, parce que vous n'êtes pas en relation des tables sur le niveau de base de données qui devrait normalement se produire.

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

Possible en double: doctrine joindre sans relation

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top