konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

Witam.

Kolejne pytanie odnośnie ZF z mojej strony. Chodzi o wyciągnięcie nazwy dostawcy, mając ID towaru.

Schematycznie baza wygląda tak:
SQL:
Towar: ID, Dostawca (int, wskazuje na ID dostawcy)
Dostawca: ID, Nazwa

indexController:

public function produktAction()
{
$oRequest = $this->getRequest();
$iProd = $oRequest->getParam('id');

$oProdukty = new Hurtownia_Model_Produkty();
$this->view->aProdukt = $oProdukty->fetchRow( "tow_id = {$iProd}");

$oDostawcy = new Hurtownia_Model_Dostawcy();
$this->view->aDostawca = $oDostawcy->fetchRow( COS TUTAJ? );
}


Model Produkty.php:

<?php
class Hurtownia_Model_Produkty extends Zend_Db_Table_Abstract {
protected $_name = 'hurt_towar';
protected $_primary = 'tow_id';

}
?>



I w zasadzie dalej nie ogarniam, jak uzależnić pobranie Dostawcy w zależności od Towaru.Daniel Kossakowski edytował(a) ten post dnia 20.05.10 o godzinie 09:38

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

http://framework.zend.com/manual/en/zend.db.select.html
akapit: Adding Another Table to the Query with JOINAndrzej Maciurzyński edytował(a) ten post dnia 20.05.10 o godzinie 09:59
Łukasz Jurys

Łukasz Jurys Full-stack developer
- Symfony, magento
2, Angular, Swift

Temat: Wyciąganie rekordów z użyciem WHERE

najprościej rzucić manualem....

w modelu, w funkcji bieżącej tabeli
$sql = $this->select()->where('id=?',$id);
return $this->fetchRow($sql);
w kontrolerze
$this->view->zwrot = $model->funkcja($id);

najprostrzy sposób bez exceptions itd
cała logika aplikacji powinna być w modelu, a nie w kontrolerach ułatwia późniejszą pracę i konserwację ;)
Jarek W.

Jarek W. Software Engineer

Temat: Wyciąganie rekordów z użyciem WHERE

http://framework.zend.com/manual/en/zend.db.table.rela... - zobacz na "Fetching a Parent Row".Jarek W. edytował(a) ten post dnia 21.05.10 o godzinie 00:10

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

Przekształciłem model, ale nie chce za bardzo współpracować.

class Hurtownia_Model_Produkty extends Zend_Db_Table_Abstract {
protected $_name = 'hurt_towar';
protected $_primary = 'tow_id';
public function ShowProduct($id){

$sql = $this->select()
->from(array('t' => 'hurt_towar'), array('tow_id', 'tow_nazwa'))
->join(array('d' => 'hurt_dostawcy'), 't.tow_dostawca = d.dos_id')
->where('tow_id=?', $id);

return $this->fetchRow($sql); }

}


Sypie błędem:
Message: Select query cannot join with another table

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

Najszybciej będzie jak zamienisz:
$sql = $this->select()

na
$sql = $this->select()->setIntegrityCheck(false)

Dokładniej opisane jest tutaj: http://framework.zend.com/manual/en/zend.db.table.html...

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

Tak też uczyniłem:

$sql = $this->select()->setIntegrityCheck(false)
->where('tow_id = ?', $id)
->join('hurt_dostawcy', 'hurt_dostawcy.tow_dostawca = hurt_towar.dos_id');



Message: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tow_id' in 'where clause'

Ale jak już wywalę linijkę z join, to wszystko działa. Nie pojmuję tego. W przykładzie jest identycznie ;D
Jarek W.

Jarek W. Software Engineer

Temat: Wyciąganie rekordów z użyciem WHERE

A naprawdę nie byłoby prościej i przejrzyściej w ten sposób:


class Hurtownia_Model_Dostawcy extends Zend_Db_Table {
protected $_name = 'dostawcy';
protected $_primary = 'id';
protected $_dependentTables = array('Hurtownia_Model_Produkty');
}

class Hurtownia_Model_Produkty extends Zend_Db_Table {
protected $_name = 'towary';
protected $_primary = 'id';
protected $_referenceMap = array(
'Produkt' => array(
'columns' => 'dostawca',
'refTableClass' => 'Hurtownia_Model_Dostawcy',
'refColumns' => 'id',
),
);
}

//i dalej, w metodzie produktAction():

$dostawcy = new Hurtownia_Model_Dostawcy();
$produkty = new Hurtownia_Model_Produkty();

$oRequest = $this->getRequest();
$iProd = $oRequest->getParam('id');

$daneProduktu = $produkty->find($iProd)->current();

$daneDostawcy = $daneProduktu->findParentRow('Hurtownia_Model_Dostawcy');


(pomijam sprawdzenia czy produkt o danym id na pewno istnieje itp.)?

$daneDostawcy byłby obiektem klasy Zend_Db_Table_Row wyłonionym na podstawie produktu o identyfikatorze $iProd.

No ale jak wolisz - każdy kodzi po swojemu. ;-)

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

Jarku, a powiesz mi jak to wyprintować w widoku?

Bo kombinowałem na różne sposoby, ostatni tak wyglądał:
$this->view->aProdukt = $daneDostawcy->toArray();

I nijak to się kończyło
Jarek W.

Jarek W. Software Engineer

Temat: Wyciąganie rekordów z użyciem WHERE

Jeżeli chcesz przypisać do widoku identyfikator i nazwę dostawcy, to możesz to zrobić na przykład tak:


$this->view->idDostawcy = $daneDostawcy->id;
$this->view->nazwaDostawcy = $daneDostawcy->nazwa;


A jeśli chodzi o towar, to na przykład identyfikator produktu możesz przypisać tak:


$this->view->idProduktu = $daneProduktu->id;


A jak przypisywałeś całą tablicę danych, to co otrzymywałeś w rezultacie? Może po prostu źle się odwołałeś do zmiennej w widoku?Jarek W. edytował(a) ten post dnia 23.05.10 o godzinie 18:32

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

Działa pięknie. Wcześniej faktycznie źle tablice dawałem. Literówkę miałem w nazwie.

A zdradziłbyś mi to:
(pomijam sprawdzenia czy produkt o danym id na pewno istnieje itp.)?
Jarek W.

Jarek W. Software Engineer

Temat: Wyciąganie rekordów z użyciem WHERE

Daniel Kossakowski:
Działa pięknie. Wcześniej faktycznie źle tablice dawałem. Literówkę miałem w nazwie.

A zdradziłbyś mi to:
(pomijam sprawdzenia czy produkt o danym id na pewno istnieje itp.)?

No generalnie chodzi o coś w rodzaju:


$daneProduktu = $produkty->find($iProd)->current();
if(null === $daneProduktu) {
//Obsługa sytuacji gdy nie znaleziono produktu o identyfikatorze $iProd
}


Polecam zaznajomienie się z http://framework.zend.com/manual/en/zend.db.html

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

A co w przypadku, kiedy między tabelami zachodzi zależność, że z innej muszę pobrać kilka rekordów. Wyczytałem, że coś z Rowset'em, ale nie bardzo to rozumiem.

Controller:

$katParametry = $daneProduktu->findParentRow('Hurtownia_Model_ParametryKategoria');


i klasa produktów:

<?php
class Hurtownia_Model_Produkty extends Zend_Db_Table {
protected $_name = 'hurt_towar';
protected $_primary = 'tow_id';
protected $_referenceMap = array(
'Produkt' => array(
'columns' => 'tow_dostawca',
'refTableClass' => 'Hurtownia_Model_Dostawcy',
'refColumns' => 'dos_id',
),
'ParamKat' => array(
'columns' => 'tow_kat',
'refTableClass' => 'Hurtownia_Model_ParametryKategoria',
'refColumns' => 'pak_kat',
),
);
}
?>


Teraz dostaję w tablicy jeden rekord (parametr), a jest ich kilka.
Jarek W.

Jarek W. Software Engineer

Temat: Wyciąganie rekordów z użyciem WHERE

Tak jak wcześniej wspominałem, wszystko to jest na http://framework.zend.com/manual/en/zend.db.table.rela...

W tym przypadku chodzi Ci zapewne o metodę findDependentRowset() - zobacz na powyższej stronie "Fetching a Dependent Rowset".

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

No tak. Porobiłem referencje i kończy mi się to błędem:

Message: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound


O jaki parametr chodzi? Mam centralnie tak jak jest w manualu:

$daneDostawcy = $daneProduktu->findParentRow('Hurtownia_Model_Dostawcy');
$kat_param = new Hurtownia_Model_ParametryKategoria();
$tow_param = new Hurtownia_Model_ParametryTowar();
$this->view->aProdukt = $daneProduktu;
$this->view->aDostawca = $daneDostawcy;
$this->view->aKatParam = $daneProduktu->findDependentRowset('Hurtownia_Model_ParametryKategoria');
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: Wyciąganie rekordów z użyciem WHERE

lepiej zaciągnij sobie Doctrine do projektu, nie ma co się męczyć z Zend_Db_Table. Ostatnio doszedłem do takiego wniosku i nie żałuję!

http://www.zendcasts.com/deep-integration-between-zend...

Pozdr.

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

Artur Świerc:
lepiej zaciągnij sobie Doctrine do projektu, nie ma co się męczyć z Zend_Db_Table. Ostatnio doszedłem do takiego wniosku i nie żałuję!

http://www.zendcasts.com/deep-integration-between-zend...

Pozdr.

Dopinanie jednego kombajnu do drugiego kombajny tylko dla kilku WHERE ??
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: Wyciąganie rekordów z użyciem WHERE

Piotr Lewandowski:
Dopinanie jednego kombajnu do drugiego kombajny tylko dla kilku WHERE ??

Ja tam widzę parent/dependentRowset

konto usunięte

Temat: Wyciąganie rekordów z użyciem WHERE

Artur Świerc:
Piotr Lewandowski:
Dopinanie jednego kombajnu do drugiego kombajny tylko dla kilku WHERE ??

Ja tam widzę parent/dependentRowset

ok, nie czytałem uważnie... zasugerowałem się tematem: "Wyciąganie rekordów z użyciem WHERE"... sam właśnie stoję przed dylematem "zintegrować Doctrine do projektu czy nie?"...
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: Wyciąganie rekordów z użyciem WHERE

Piotr Lewandowski:
Artur Świerc:
Piotr Lewandowski:
Dopinanie jednego kombajnu do drugiego kombajny tylko dla kilku WHERE ??

Ja tam widzę parent/dependentRowset

ok, nie czytałem uważnie... zasugerowałem się tematem: "Wyciąganie rekordów z użyciem WHERE"... sam właśnie stoję przed dylematem "zintegrować Doctrine do projektu czy nie?"...

Piotrze, nie ma się co zastanawiać. Piszę też w JEE i dla mnie doctrine jest bardziej inuicyjny, przypomina JPA/Hibernate. Łatwiej skonfigurować relacje i wyciągać (sub)wiersze. Nie wiem jak z wydajnością, ale wg mnie wychodzi na to samo - po prostu rezygnujesz z jednego ORM'a na rzecz drugiego. Może ktoś ma jakieś statystyki ?

Następna dyskusja:

SELECT WHERE IN




Wyślij zaproszenie do