Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework] Wywołanie podwójnego select'a
CzarnyGsm
post
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 2
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
IceManSpy
post
Post #2





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Nie query, tylko fetchAll w celu pobrania wszystkich rekordów.
Go to the top of the page
+Quote Post
CzarnyGsm
post
Post #3





Grupa: Zarejestrowani
Postów: 84
Pomógł: 2
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


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.

Ten post edytował CzarnyGsm 6.11.2011, 12:05:57
Go to the top of the page
+Quote Post
mortus
post
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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


Ten post edytował mortus 6.11.2011, 12:28:33
Go to the top of the page
+Quote Post
IceManSpy
post
Post #5





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
mortus
post
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mortus 6.11.2011, 12:42:33
Go to the top of the page
+Quote Post
CzarnyGsm
post
Post #7





Grupa: Zarejestrowani
Postów: 84
Pomógł: 2
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
IceManSpy
post
Post #8





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował IceManSpy 6.11.2011, 17:52:41
Go to the top of the page
+Quote Post
CzarnyGsm
post
Post #9





Grupa: Zarejestrowani
Postów: 84
Pomógł: 2
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


Tak, pcms_tag_weight to jest nazwa tabeli, a dokładnie tabeli typu widok.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 06:33