2010-05-31 2 views
1

La requête suivante renvoie une ligne comme prévu lorsqu'elle est exécutée à partir de phpmyadmin.Kohana 3 - Le générateur de requête donne 0 ligne

SELECT units . * , locations . * 
FROM units, locations 
WHERE units.id = '1' 
AND units.location_id = locations.id 
LIMIT 0 , 30 

Mais lorsque je tente de le faire en Kohana 3:

$unit = DB::select('units.*', 'locations.*') 
->from('units', 'locations') 
->where('units.id', '=', $id)->and_where('units.location_id', '=', 'locations.id') 
->execute()->as_array(); 
var_dump($unit); 

Il imprime

array(0) { }

Qu'est-ce que je fais mal?

Répondre

4

Je ne peux pas dire immédiatement ce qui ne va pas avec ce générateur de requête, cependant, vérifiez ceci pour des raisons de débogage. Après avoir appelé execute() sur votre chaîne DB, essayez ceci.

echo Database::instance()->last_query; 

Ceci affichera en langage SQL simple la dernière requête effectuée. Il vaudra la peine de regarder ce que le générateur de requête a généré, et en quoi il diffère de celui que vous avez utilisé dans phpmyadmin.

Si tout le reste échoue, utilisez simplement les méthodes de requête simples.

$query = "SELECT units . * , locations . * 
FROM units, locations 
WHERE units.id = :id 
AND units.location_id = locations.id 
LIMIT 0 , 30 "; 

$unit = Db::query(Database::SELECT, $query) 
      ->bind(':id', (int) $id) 
      ->execute() 
      ->as_array(); 
+0

echo Base de données :: instance() -> last_query; me donne: SELECT 'locations'. *,' units'. * FROM 'units',' locations' O WH 'units'.'location_id' = 'locations.id' ET' units'.'id' = '1' Il semble que le bug devrait être 'locations'.' 'Id '' et non 'locations.id' ??? En utilisant la méthode de requête simple que vous suggérez m'a donné l'erreur suivante: ErrorException [Erreur fatale]: ne peut pas passer le paramètre 2 par référence en ligne "-> bind (': id', (int) $ id)" – pigfox

+0

@OK, umm essayez de supprimer la distribution en entier, ou assurez-vous que $ id est configuré quelque part (peut être après comme il est passé par référence) – alex

0

Vous remarquerez que votre appel à last_query retourné (dans la partie where):

WHERE units.location_id = 'locations.id' la valeur transmise par comparaison est cité comme une chaîne, d'où un jeu de résultats vide. Pour ce qui est de votre erreur fatale, vérifiez que vous transmettez $ id explicitement (et non une copie référencée d'une autre variable), c'est tout ce que je pouvais penser étant donné que vous ne fournissez pas n'importe quelle source.