2013-04-17 3 views
0

J'ai une requête qui contient plusieurs instructions orWhere. Le code PHP ressemble à ceci:Comportement étrange avec Doctrine_Query dans Doctrine 1.2

$firstDay = $params['datetimeForMonth']->format('Y-m-d'); 
$lastDay = $params['datetimeForMonth']->format('Y-m-t 23:59:59'); 
$whereStatement = "(s.level = ? 
    AND s.idForLevel IN (?) 
    AND s.startDatetime BETWEEN '$firstDay' AND '$lastDay')"; 
$q = Doctrine_Query::create() 
    ->from('Mmb_Model_Schedule s') 
    ->where($whereStatement, ['prefecture', $this->id]) 
    ->orWhere($whereStatement, ['district', $districtIds]) 
    ->orWhere($whereStatement, ['municipality', $municipalityIds]) 
    ->orWhere($whereStatement, ['workplace', $workplaceIds]) 
    ->orWhere($whereStatement, ['user', $userIds]); 

Les variables districtIds $, municipalityIds $, workplaceIds $ et UserIds $ sont tous définis à l'avance sous forme de valeurs séparées par des virgules.

Cette requête fonctionne très bien avec tous les niveaux sauf pour les ID de district. Tout enregistrement avec le niveau "district" ne sera pas retourné dans la requête.

Ce qui est vraiment étrange est que, si je ne pas utiliser les paramètres liés, mais plutôt insérer le code suivant, tout fonctionne bien:

->orWhere("s.level = 'district' AND s.idForLevel IN ($districtIds) AND s.startDatetime BETWEEN '$firstDay' AND '$lastDay'") 

Ce qui est encore plus rageant est que même cette requête fait tout par lui-même comme une seule instruction where (excluant toutes les autres) ne me donne rien si j'utilise des paramètres liés. Et comme si cela ne suffisait pas, j'ai même essayé de mettre à jour la table en changeant 'district' en 'prefDistrict', juste au cas où le mot 'district' causerait le problème. Rien n'a changé.

Malgré le fait que j'insère les données EXACT SAME en tant que paramètres liés que lorsque vous les entrez directement, le comportement change radicalement. Que se passe-t-il ici?

Répondre

0

Je veux dire qu'il doit y avoir quelque chose dans les valeurs de la var $districtIds qui déclenche le constructeur de requête dans Doctrine. Pouvez-vous poster un échantillon de ces valeurs?

De même, avez-vous regardé le SQL généré que la doctrine exécute (suivi d'un journal SQL ou hooking dans l'événement preExecute)? Je serais curieux de voir la sortie de quelque chose comme ça.

(cela devrait probablement être un commentaire, mais ma réputation est pas assez élevé pour cela;))

+0

Ils sont rien d'autre que des valeurs entières. – blainarmstrong

Questions connexes