tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Podmíněné podmínky a jejich automatické spojování pomocí AND

před 7 lety

besir
Člen | 177

Ahoj,
mám nějaký takovýto model v nette

public static function getLikeProperties($args) {

        $arr = array('locality' => null,
                     'type'     => null,
                     'size'     => null,
                     'category' => null);

        $arr = array_merge($arr, $args);

        $limit = isset($arr['limit']) ?  $arr['limit'] : 4;


        return dibi::fetchAll('SELECT [p.id], [p.name], [pt.name] as type,
                                    [ps.value] as size,
                                    (SELECT [pi.uri] FROM [properties_images] as pi
                                        WHERE [pi.property_id] = p.id) as image
                                FROM [properties] as p
                                LEFT JOIN ([properties_type] as pt,
                                        [properties_sizes] as ps,
                                        [properties_locality] as pl,
                                        [properties_category] as pc)
                                ON ([p.type_id] = [pt.id] AND [p.size_id] = ps.id)',
                                '%if',
                                    (isset($arr['type']) or
                                    isset($arr['locality']) or
                                    isset($arr['size']) or
                                    isset($arr['category'])),
                                    'WHERE',
                                        '%if', $arr['type'] != null,' [pt.name] IN %l', $arr['type'],
                                        '%if', $arr['locality'] != null,' AND [pl.name] IN %l', $arr['locality'],
                                        '%if', $arr['size'] != null,' AND  [ps.value] IN %in', $arr['size'],
                                        '%if', $arr['category'] != null,' AND  [pc.name] IN %in', $arr['category']);

    }

asi nemusím říkat co to má vracet.

Otázka, jak to mám potunit aby se poslední 4 %if spojili automaticky pomocí AND pokud nejsou jediný? Vše samozřejmě funguje pokud je vždy nastavený $arr[‚type‘], ale nemusí být. Zatím mám hotfix style 1=1, ale to se mi nezdá jako best practice.

Díky

před 7 lety

Felix
Nette Core | 898

Ja bych pouzil dibi fluent a neceho jako

$sql = dibi::select(..);

if (isset($arr['type'])) {
    $sql->where(..);
}

Editoval Felix (12. 9. 2012 21:48)