Това трябва да работи за вас:
Така че, както вече беше казано в коментарите, имате нужда от контейнер за всяка стойност, която искате да свържете в клаузата IN.
Тук първо създавам масива $ids
който съдържа само обикновените идентификатори, напр.
[2, 3]
След това създадох и масива $preparedIds
който съдържа контейнерите като масив, който след това използвате по-късно в подготвения израз. Този масив изглежда по следния начин:
[":id2", ":id3"]
Освен това създавам масив, наречен $preparedValues
който съдържа $preparedIds
като ключове и $ids
като стойности, които по-късно можете да използвате за execute()
повикване. Масивът изглежда по следния начин:
[":id2" => 2, ":id3" => 3]
След това сте готови. В подготвения оператор аз просто implode()
$preparedIds
масив, така че SQL операторът да изглежда по следния начин:
... IN(:id2,:id3) ...
И тогава можете просто да execute()
вашето запитване. Там просто array_merge()
вашите $preparedValues
масив с другия масив от заместители.
<?php
$ids = array_map(function($item){
return $item->id;
}, $entitlementsVOs);
$preparedIds = array_map(function($v){
return ":id$v";
}, $ids);
$preparedValues = array_combine($preparedIds, $ids);
$timestart = (!empty($_GET['start']) ? $_GET['start'] : NULL );
$timeend = (!empty($_GET['end']) ? $_GET['end'] : NULL );
$statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(" . implode(",", $preparedIds) . ") AND timestart >= :timestart AND timestart + timeduration <= :timeend");
$statement->setFetchMode(\PDO::FETCH_CLASS, get_class(new EventVO()));
if($statement->execute(array_merge($preparedValues, ["timestart" => $timestart, "timeend" => $timeend]))) {
return $statement->fetchAll();
} else {
return null;
}
?>
Също така мисля, че искате да поставите оператор if около вашата заявка, тъй като вашата заявка няма да се изпълни, ако стойностите на $timestart
и $timeend
са NULL.