2012-08-08 23 views
7

Przede wszystkim, to właśnie próbuję zrobić:Zend: Wybierz obiekt: Jak zastąpić wybrane kolumny za pomocą od()?

W jednej z moich zajęć w bibliotece chcę policzyć całkowitą liczbę wierszy wyniku wyszukiwania. Klasa korzysta z wybranego obiektu ustawionego przez dołączony model wyniku wyszukiwania. Mój problem jest teraz, ten select() już ustawił żądane kolumny według from(), ale po prostu policz wiersze, które chcę tylko wybrać, ponieważ strona musi być wydajna. Nie mogę po prostu zmienić wartości obiektu, ponieważ używam go w bibliotece, a zmienne są chronione. Niestety Zend nie ma funkcji dla komendy mySql count i nie chcę używać statycznego kodu mySql, ponieważ może się zdarzyć, że w przyszłości zmienimy nasz system baz danych.

Teraz tutaj jest moje pytanie:

Czy istnieje możliwość, przez Zend_Select jak mogę zmienić wybrane kolumny?

Odpowiedz

15

Spróbuj tego:

$select->reset(Zend_Db_Select::COLUMNS) 
     ->from('thetable', 'COUNT(*)'); 

zastępując 'thetable' z poprawną nazwą tabeli.

+0

Musiałem usunąć stałą FROM, ale to jest dokładnie to, czego szukałem, dziękuję bardzo! – StoryTeller

+0

Mam kilka "wewnętrznych sprzężeń" w moim zapytaniu i po zresetowaniu KOLUMNY , automatycznie dodaje "Wewnętrzne sprzężenie" ze stołem FROM! Co robię źle? –

1

To jest z projektu i nie jest testowane, ale jedna z nich powinna działać.

$select->from(array("table_name" => "table_name"), array("my_col" => "COUNT(id)")); 

LUB

$select->from(array("table_name"), array("my_col" => "COUNT(id)")); 

To jest taka sama jak

SELECT COUNT(id) as my_col FROM table_name 

nadzieję, że pomoże

Jake

+0

Niestety nie otrzymuję wyjątek: Nie można zdefiniować nazwa korelacji 'bd_users' więcej niż jeden raz – StoryTeller

+0

Możesz przekazać pustą tablicę jako pierwszy parametr, ponieważ nie musisz ponownie dodawać tabeli. W ten sposób nie będzie próbował ponownie deklarować korelacji. – Eric

-1

Aby użyć polecenia mysql w select, trzeba użyć Zend_Db_Expr:

$select = $this->select() 
      ->from('myTable', new Zend_Db_Expr('COUNT(id) as count')); 
echo $select; //SELECT COUNT(id) as count FROM myTable; 
+0

Nie jestem w Modelu i nie mogę zapisać tego kodu wewnątrz modelu. Przeczytaj pytanie. – StoryTeller

+1

Jeśli chcesz użyć count, to właściwą metodą powinno być 'from ('myTable', array ('count' => nowy Zend_Db_Expr ('count (*)'))' (lub ID zamiast * jeśli potrzebujesz). ale nigdy nie powinieneś sam niczego wymieniać – Seti

1

Ten jeden nie działa dla mnie (musiałem wybrać tylko jednej połączonej tabeli):

$select->reset(Zend_Db_Select::COLUMNS) 
    ->from('thetable', 'COUNT(*)'); 

Może dlatego, że miałem trochę łączy. Ale mimo to, oto rozwiązanie: użyć reset(), a następnie kolumny():

$select->setIntegrityCheck(false) 
     ->from(['t1' => 'table1']) 
     ->join(['t2' => 't2'], 't1.id = t2.t1_id') 
     ->reset(Zend_Db_Select::COLUMNS) 
     ->columns('t1.*'); 

Wystarczy FYI, wersja Zend Framework 1.12

Powiązane problemy