lut 06

Zend Framework dostarcza szybkich i prostych metod operowania na danych zawartych w bazie, są to insert(), fetchAll(), fetchRow(), update(); Na razie skupię się tylko na tych podstawowych elementach, w przyszłości będę pewnie stopniowo rozbudowywał ten dział.

insert()

Insert przyjmuje dane w postaci tablicy przyjmijmy, że tabela guestbook zawiera dwa pola name, oraz count i chcemy zapisać do niej jeden rekord. Więc w kontrolerze lub gdzieś indziej możemy napisać

$gb = new Model_Guestbook();
$gb->insert(Array('name'=>'Tomasz','count'=>1));

Jeśli tablica będzie zawierała więcej kluczy niż pól w bazie wystąpi błąd, wyjątkiem jest sytuacja, gdy pola posiadają wartości domyślne, wtedy można ich nie podawać.
Zend Framework posiada ciekawą właściwość, jeśli w danej tabeli zdefiniujemy pole o nazwie created_at: o typie timestamp wtedy w każdy nowo dodany rekord zostanie automatycznie dopisana data jego utworzenia.

fetchAll()

Metoda fetchAll($where, $order, $count, $offset); Zwraca wszystkie rekordy z określonej tabeli w postaci obiektu typu Zend_Db_Table_Rowset z iteratorem dla obiektów Zend_Db_Table_Rows (dzięki temu możliwe jest przeglądanie kolekcji za pomocą pętli foreach). Prosty przykład:

$gb = new Model_Guestbook();
$rows = $gb->fetchAll("id>2");
foreach ($rows as $row){
	echo $row->id.'
'; }

fetchRow()

Metoda fetchRow($where,$order) zwraca pierwszy “rekord” z wyniku spełniającego warunek $where z uporządkowaniem $order. Przykładowo:

$gb = new Model_Guestbook();
$row = $gb->fetchRow("id>2");
echo "Odczyt 1: ".$row->id.'
'; echo "Odczyt 2: ".$row['id'].'
';

Jak widać dane można odczytać w dwojaki sposób.

update()

Metoda update($data, $where) aktualizuje dane na podstawie tablicy asocjacyjnej uwzględniając warunek $where.

$gb = new Model_Guestbook();
$gb->update(Array('name'=>'test'),"id=1");

Update na danych można wykonać również w inny sposób

$gb = new Model_Guestbook();
$row = $gb->fetchRow("id>2");
$row->name='zmieniamy pole';
$row->save();

Zwykłe zapytanie select w modelu danych

Jeśli zachodzi sytuacja, gdy musimy wykonać jakiegoś nietypowego selecta w modelu danych i zwrócić wynik w postaci tablicy bądź obiektu możemy skorzystać z metody select. Stwórzmy metodę getData() w naszym przykładowym modelu danych:

class Model_Guestbook extends Zend_Db_Table_Abstract
{
    protected $_name="guestbook";
    protected $_primary = 'id';
    public function getData(){
        $rows = $this->select("SELECT * FROM guestbook ")->query(zend_db::FETCH_OBJ);
        return $rows;
    }
}

Metoda query jest obowiązkowa gdyż uruchamia ona zapytanie, metodzie query Możemy przekazać informację jakiego typu dane chcemy uzyskać, może to być FETCH_OBJ, czyli w postaci obiektów, FETCH_ASSOC tablica asocjacyjna lub FETCH_BOTH tablica asocjacyjna i oraz indeksy. Są też inne typy. Alternatywą jest poniższy przykład:

class Model_Guestbook extends Zend_Db_Table_Abstract
{
	protected $_name="guestbook";
	protected $_primary = 'id';
	public function getData(){
		$rows = $this->select()
			->from($this->_name)
			->where("id>1")
			->query(ZEND_DB::FETCH_OBJ);
		return $rows;
	}
}

Zapytanie select poza modelem np. w kontrolerze

Zasada jest podobna jak w powyższym przykładzie ale może zajść konieczność wykonania zapytania poza modelem danych np. w kontrolerze, nie ważne czy się tak powinno robić czy nie. Aby to wykonać potrzebny jest nam identyfikator (adapter) połączenia

public function indexAction()
{
$db = Zend_Db_Table::getDefaultAdapter();
    $rows = $db->select()
    ->from("guestbook",Array("name","id"))
    ->where("id>1")
    ->query(ZEND_DB::FETCH_OBJ);
    foreach ($rows as $row)echo $row->name.'
'; }

Autor siema \\ tagi: , , , , , , , , , , , ,



2 Odpowiedzi do “Podstawowe operacje na modelu”

  1. mymymy napisał(a):

    FETCH_BOTH nie FETCH_BOTCH. Literówka:)

  2. Elo ;] napisał(a):

    Ta ciekawa właściwość pola “created_at”. Nie lepiej jest ustawić pole w DB z atrybutem “on update CURRENT_TIMESTAMP” i domyślną wartością: “CURRENT_TIMESTAMP”? Efekt będzie ten sam… tylko że, pole może się nazywać dowolnie oraz mysql uzupełnia te dane. PHP (ZF) nie będzie musiał wysyłać niepotrzebnych zapytań.