Home > PHP > Modele w Zend framework

Modele w Zend framework

Czym jest model, a raczej warstwa modelu? Pomaga ona nam oddzielić warstwę danych od pozostałych warstw aplikacji. Ułatwia ona operacje na danych dzięki czemu, wszystkie operacje związane z pobieraniem danych możemy zamknąć w jednym miejscu.

Jednym z kluczowych elementów ZF jest Zend_Db, której funkcjonalność jest podstawą istnienia warstwy modelu ZF. Zend_Db można wykorzystać na wiele sposobów w zależności od tego jak chcemy skonstruować nasze modele.

Ale po kolei… Żeby móc tworzyć modele dla naszej aplikacji trzeba najpierw połączyć się z bazą.

Wygląda to mniej więcej tak:

1
2
3
4
5
6
7
...
$cfg = $Config->db->config->toArray();
$cfg['driver_options'] = array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); 
$db = Zend_Db::factory("PDO_MYSQL", $cfg );
//ustawiamy domyślny adapter
Zend_Db_Table::setDefaultAdapter($db);
...

Tworzenie modeli

Przy większej ilości obsługiwanych baz dany model wywołujemy z adapterem jako parametrem np.
$model = new TestModel(array(’db’ => $db));

Teraz możemy przystąpić do tworzenia modeli z użyciem Zend_Db_Table

1
2
3
4
5
6
7
8
9
class TestModel extend Zend_Db_Table
{
    public $_name = "test_table";
 
    public function getAll()
    {
        return $this->fetchAll();  //zwraca Zend_Db_Table_Rowset Object 
    }
}

Metoda fetchAll() zwraca nam obiekt Zend_Db_Table_Rowset. Ja wolę pracować na tablicach dlatego metoda fetchAll() w mich aplikacjach jest wywoływana trochę inaczej:

1
2
3
4
5
6
...
    public function getAll()
    {
        $sql = "SELECT * FROM {$this->_name} ORDER BY date DESC";
        return $this->getdefaultAdapter->fetchAll($sql);  //zwraca Array
    }

W ten sposób możemy napisać większość naszych metod pobierających dane używając czystych zapytać SQL. W niektórych przypadkach o wiele łatwiej jest napisać zapytanie w czystym SQL’u.

Nie jest to jednak elastyczne rozwiązanie. W przypadku gdy nasza aplikacja będzie miała pracować na innym systemie bazodanowym niż domyślny, wtedy będziemy musieli tworzyć dodatkowy model dla każdego rodzaju bazy danych, co może stwarzać problemy przy wdrażaniu aplikacji. Rozwiązaniem tego problemu jest Zend_Db_Select , który umożliwia nam tworzenie zapytań w zunifikowany sposób np.

1
2
3
4
5
6
7
8
9
10
11
12
...
    public function getAll()
    {
        $sql = $this->select()->order('date DESC');
        return $this->getdefaultAdapter->fetchAll($sql);
    }
 
    public function getById($id)
    {
        $sql = $this->select()->where('id = ?', $id);
        return $this->getDefaultAdapter->fetchAll($sql);
    }

Dodatkowo dane jakie wprowadzamy do zapytania są automatycznie escapowane, dzięki czemu nie musimy o tym za każdym razem pamiętać.

Oczywiście przy pomocy Zend_Db_Select mamy możliwość odwzorowania prawie każdego zapytania sql. Najłatwiejszym sposobem podejrzenia tego co generuje nam Zend_Db_Select jest poprostu wydrukowanie tego.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
    public function getById($id)
    {
        $sql = $select = $db->select()
                               ->from(array('p' => 'products'),
                               array('product_id', 'product_name'))
                               ->join(array('l' => 'line_items'),
                               'p.product_id = l.product_id',
                               array() ); // empty list of columns
        print $sql;
        //SELECT p."product_id", p."product_name"
        //   FROM "products" AS p JOIN "line_items" AS l
        //     ON p.product_id = l.product_id
        return $this->getDefaultAdapter->fetchAll($sql);
    }
...

To by było na tyle odnośnie Zend_Db_Select, więcej informacji znajdziecie w dokumentacji.

Rozszerzanie modeli

Żeby ułatwić sobie pracę z modelami i nie dodawać sobie pracy i zbędnych linijek Tworzymy sobie model bazowy, w którym umieszczany wszystkie niezbędne metody, które mogą nam się przydać w całej aplikacji.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Model extend Zend_Db_Table_Abstract
{
    public function getAll()
    {
        $sql = $this->select()->order('id DESC');
        return $this->getDefaultAdapter->fetchAll($sql);
    }
 
    public function getById($id)
    {
        $sql = $this->select()->where('id = ?', $id);
        return $this->getDefaultAdapter->fetchAll($sql);
    }
 
    public function getMaxPosition()
    {
        $sql = $this->select()->from($this->_name, 'MAX(position)');
        return $this->getDefaultAdapter->fetchAll($sql);
    }
    ...
}

Kolejne modele stworzone dla poszczególnych tabel będą dziedziczyły z modelu bazowego.

1
2
3
4
5
6
7
8
9
10
11
12
class TestModel extend Model
{
    protected $_name = 'test_table';
 
    //Metody specyficzne dla danego modelu
    public function getTestData()
    {
        $sql = $this->select()->order('name DESC');
        return $this->fetchAll($sql);
    }
    ...
}

No i nie trudno się domyśleć, że wywołując model w kontrolerze będziemy mieli dostęp do metod z obu modeli.

1
2
3
4
5
6
$m = new TestModel();
$m->getAll();
$m->getById($id)
$m->getMaxPosition();
$m->getTestData();
...

Podsumowanie

Mam nadzieje, że w miarę zwięźle opisałem wszystkie zagadnienia związane z modelami w ZF. Więcej informacji można znaleźć w dokumentacji Zend_DB.

Powiązane wpisy:

admin PHP , , , ,

  1. No comments yet.
  1. No trackbacks yet.
agencja reklamowa lublin ślub i wesele senniki