Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Active Record - where
Forum PHP.pl > Forum > PHP > Object-oriented programming
ayeo
W celach edukacyjnych piszę sobie coś jakby Active Record. Zastanawiam się jak to jest z klauzulą WHERE w innych tego typu rozwiązaniach. Jak na razie to widziałem tylko w Code Igniter coś takiego:

$AR->where($nazwa_kolumy, $wartość);

co oznacza WHERE nazwa_kolumny = wartość. Można oczywiście wywołać tą metodę wielokrotnie co nam połączy poszczególne zapytania. Problemem jest przekazywanie warunków typu WHERE nazwa_kolumny > wartość lub jakieś bardziej skomplikowane zapytania typu:

WHERE (kolumna1 > 10 OR kolumna2 < 100) AND kolumna3 = 1

Można to niby rozwiązać przez przekazywanie całego warunku do metody where(); jednak stwarza to dodatkowe problemy. Jakie są wasze propozycje i jak Wy rozwiązujecie coś takiego u siebie?

Z góry dziękuję za wszelkie rady/wskazówki/sugestie. Pozdrawiam!
sobstel
Na wzór prepared statements, tj. where('age > ?', $age);
LBO
eZComponents udostępnia specjalny obiekt ezcQueryExpression uzbrojone w odpowiedni zestaw metod:

  1. <?php
  2. $q->select( '*' )->from( 'table' )
  3.  
  4.  
  5. // WHERE id = 1
  6. ->where( $q->expr->eq( 'id', $q->bindValue( 1 ) ) );
  7.  
  8. // WHERE id <> 1
  9. ->where( $q->expr->neq( 'id', $q->bindValue( 1 ) ) );
  10.  
  11. // WHERE id > 1
  12. ->where( $q->expr->gt( 'id', $q->bindValue( 1 ) ) );
  13.  
  14. // WHERE id IN (1, 2, 3)
  15. ->where( $q->expr->in( 'id', 1, 2, 3 ) );
  16.  
  17. // etc
  18. ?>
Sedziwoj
A może coś na wzór Propela?
  1. <?php
  2. $c = new Criteria();
  3. //parametry: nazwa kolumny, wartość, metoda porównania
  4. $c->add( ProArticlePeer::TITLE, '%'.$strTitle.'%', Criteria::LIKE );
  5. $cton1 = $c->getNewCriterion( ProArticlePeer::AUTHOR, '%'.$strAuthor.'%', Criteria::LIKE );
  6. $cton2 = $c->getNewCriterion( ProArticlePeer::NUMBER, $intNumber, Criteria::LESS_THAN );
  7. $cton3 = $c->getNewCriterion( ProArticlePeer::CONTENT, '%'.$strContent.'%', Criteria::LIKE );
  8. $cton1->addOr($cton2);
  9. $cton1->addOr($cton3);
  10. $c->add($cton1);
  11. ?>

Trochę zawikłane, ale ogólnie to co jest w nawiasach jest jako osobny obiekt Criterion, który się dodaje na pewnych warunkach do innego itd. ...

EDIT:
  1. WHERE ( ( author LIKE '%$strAuthor%' OR number < $intNumber ) OR content LIKE '%$strContent%' ) AND title LIKE '%$strTitle%'
ayeo
Dziękuję wszystkim za rzeczowe odpowiedzi. Zrobię chyba dodatkowy obiekt Critereia (uproszczony) tak jak w Propelu.
Sedziwoj
Dokładnie w Propelu masz dwa obiekty Criteria i Criterion, ale w Twoim przypadku byś chciał zrobić coś w stylu Criterion, bo zawiera właśnie cryteria (Criteria ma do tego złączenia, sortowanie, limity, offsety itp.)

EDIT: Głodnym, spacje zjadł biggrin.gif
ayeo
@Sedziwoj, już myślałem, że nowa klawiatura ma defekt biggrin.gif Złączenia, limity, offset robię dodatkowymi metodami w samym AR. Jednak zastanowię się nad rozwiązaniem z Propela. Dzięki za wskazówki!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.