Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Wywołanie podwójnego select'a
Forum PHP.pl > Forum > PHP > Frameworki
CzarnyGsm
Witam,

Męczę się z wywołaniem podwójnego select'a w Zendzie.
Przykładowo chciałbym wywołać zapytanie:
  1. SELECT `pcms_tag_weights` . *
  2. FROM (
  3. SELECT `pcms_tag_weights`.`title` , `pcms_tag_weights`.`weight`
  4. FROM `pcms_tag_weights`
  5. ORDER BY `pcms_tag_weights`.`weight` DESC
  6. LIMIT 0 , 5
  7. ) `pcms_tag_weights`
  8. ORDER BY `pcms_tag_weights`.`title` ASC ";


Próbowałem na wiele sposób, ale nie wychodzi mi nic tylko błędy. Przykładowo próbowałem w ten sposób:
  1. <?php
  2.  
  3. class Application_Model_TagWeights extends Zend_Db_Table_Abstract {
  4.  
  5. protected $_name = 'pcms_tag_weights';
  6.  
  7. public function getTagWeights(){
  8. $sql = "SELECT `pcms_tag_weights` . *
  9. FROM (
  10. SELECT `pcms_tag_weights`.`title` , `pcms_tag_weights`.`weight`
  11. FROM `pcms_tag_weights`
  12. ORDER BY `pcms_tag_weights`.`weight` DESC
  13. LIMIT 0 , 5
  14. ) `pcms_tag_weights`
  15. ORDER BY `pcms_tag_weights`.`title` ASC ";
  16. $rows = $this->query($sql);
  17. ...

Strona zwróciła błąd:
  1. Fatal error: Call to undefined method Application_Model_TagWeights::query() in C:\ProjectMy\application\models\TagWeights.php on line 18

Gdzie linijka 18 to:
  1. $rows = $this->query($sql);


Czy wina stoi tutaj po Zend_Db_Table_Abstract ? Czy muszę użyć tutaj innej klasy? Przy użyciu Zend_DB_Adapter_Abstract z kolei wyświetla mi się błąd:
  1. Fatal error: Class Application_Model_TagWeights contains 14 abstract methods and must therefore be declared abstract or implement the remaining methods (Zend_Db_Adapter_Abstract::listTables, Zend_Db_Adapter_Abstract::describeTable, Zend_Db_Adapter_Abstract::_connect, ...) in C:\ProjectMy\application\models\TagWeights.php on line 34


Z góry dziękuję za pomoc.

Pozdrawiam
IceManSpy
Nie query, tylko fetchAll w celu pobrania wszystkich rekordów.
CzarnyGsm
Próbowałem robić tak wcześniej:
Kod
$rows = $this->fetchAll($sql);

ale wyskakiwał wtedy błąd:
Kod
Message: SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)


Niżej cała zawartość pliku application/models/TagWeights.php. dodam, że tabela 'pcms_tag_weights' jest widokiem w bazie danych.
Kod
<?php

class Application_Model_TagWeights extends Zend_Db_Table_Abstract  {

    protected $_name = 'pcms_tag_weights';
    protected $_primary = 'title';
    
    public function getTagWeights(){
        $sql = "SELECT `pcms_tag_weights` . *
                    FROM (
                        SELECT `pcms_tag_weights`.`title` , `pcms_tag_weights`.`weight`
                        FROM `pcms_tag_weights`
                        ORDER BY `pcms_tag_weights`.`weight` DESC
                        LIMIT 0 , 5
                    ) `pcms_tag_weights`
                  ORDER BY `pcms_tag_weights`.`title` ASC ";
        
        $sql2 = 'SELECT `pcms_tag_weights`.`title` , `pcms_tag_weights`.`weight`
                        FROM `pcms_tag_weights`
                        ORDER BY `pcms_tag_weights`.`weight` DESC
                        LIMIT 0 , 5';
        $rows = $this->fetchAll($sql);
        print_r( $rows );
        exit;
        $select = $this->select();
        $select->from($this->_name, array($this->_name.".title", $this->_name.".weight"))
                ->order('weight DESC')
                ->limit(10,0);
        
        $rows = $this->fetchAll($select);
        return $rows;
    }
    
}


Gdy wykonuje w phpMyAdmin kod ze zmiennej $sql to zwraca mi wynik bez zarzutów.
mortus
Tylko po co te podzapytania, przecież ten sam efekt można uzyskać jednym zapytaniem:
  1. SELECT `pcms_tag_weights`.* FROM `pcms_tag_weights` ORDER BY `pcms_tag_weights`.`weight` DESC, `pcms_tag_weights`.`title` ASC LIMIT 0 , 5
IceManSpy
Strasznie dziwne rzeczy robisz o.O
Co to ma robic wg Ciebie?
  1. $rows = $this->fetchAll($sql);
  2. print_r( $rows );

Stawiam, że tutaj masz błąd:
  1. $select->from($this->_name, array($this->_name.".title", $this->_name.".weight"))

$this->_name powinno być w apostrofach.
Poza tym jeśli pobierasz z tabeli, którą zadeklarowałeś w protected $_name, to nie musisz używać $this->_name , bo Zend będzie wiedział, że od nosisz się do tej tabeli.
mortus
Pierwszy fragment, który przytoczyłeś to próba wykonania zapytania i sprawdzenie, czy próba się powiodła.
Jakim cudem może mieć błąd w drugim fragmencie, skoro exit zatrzymuje skrypt wcześniej?

@CzarnyGsm: Wpisz komunikat błędu w wyszukiwarce Google, a otrzymasz parę informacji na ten temat.
CzarnyGsm
Ups, nie przejrzałem dokładnie kopiując zawartość pliku. Niżej kod wyczyszczony bez niepotrzebnego kodu. Dziękuję bardzo za próbę pomocy.
Oczywiście błąd nadal ten sam, czyli: Message: SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)
~mortus Twój kod wyświetli całkiem inny wynik niż kod zawarty w zmiennej $sql. Wynik będzie uporządkowany tylko według title.
  1. <?php
  2.  
  3. class Application_Model_TagWeights extends Zend_Db_Table_Abstract {
  4.  
  5. protected $_name = 'pcms_tag_weights';
  6. protected $_primary = 'title';
  7.  
  8. public function getTagWeights(){
  9. $sql = "SELECT `pcms_tag_weights` . *
  10. FROM (
  11. SELECT `pcms_tag_weights`.`title` , `pcms_tag_weights`.`weight`
  12. FROM `pcms_tag_weights`
  13. ORDER BY `pcms_tag_weights`.`weight` DESC
  14. LIMIT 0 , 5
  15. ) `pcms_tag_weights`
  16. ORDER BY `pcms_tag_weights`.`title` ASC ";
  17. $rows = $this->fetchAll($sql);
  18. return $rows;
  19. }
  20.  
  21. }


Struktura bazy danych
  1. CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `pcms_tag_weights`
  2. AS SELECT `pcms_tag`.`id` AS `id`
  3. ,`pcms_tag`.`title` AS `title`
  4. ,count(0) AS `weight`
  5. FROM (`pcms_tag` JOIN `pcms_tag_articles`)
  6. WHERE (`pcms_tag`.`id` = `pcms_tag_articles`.`tag_id`)
  7. GROUP BY `pcms_tag`.`id`
  8. ORDER BY `pcms_tag`.`title`;


~mortus co do google, to pierwsze co zrobiłem to sprawdziłem w wyszukiwarce. Jedna osoba miała ten sam komunikat, ale był on spowodowany błędnym zapytaniem. Zapytanie sprawdziłem w phpMyAdmin i działa bez problemów, tutaj zaś wypluwa błąd.

Z góry dziękuję za pomoc.
IceManSpy
A "pcms_tag_weights" to jest perspektywa, czy nazwa tabeli? SQLite nie znam, tylko MySQL.
Bo w zmiennej protected $_name ma być nazwa tabeli, z której pobierasz dane.
CzarnyGsm
Tak, pcms_tag_weight to jest nazwa tabeli, a dokładnie tabeli typu widok.
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.