Реляционная база данных Zend Framework - PullRequest
1 голос
/ 06 июля 2011

Я пытаюсь выяснить, как программировать референциальное сопоставление с Zend Framework 1.11.x. У меня есть 4 таблицы: человек, города, штаты и страны. У каждого человека есть city_id, state_id и country_id, связанные с каждой строкой.

В настоящее время я могу отображать все данные, используя fetchAll, но все города, штаты и страны отображаются в цифрах, а не в соответствующих именах. Я пытался найти учебники, Google и т. Д., Но просто не могу найти хороший пример того, что я хочу сделать.

Вот код в моем контроллере:

<?php

class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract
{

protected $_name = 'person';
protected $_primary = 'person_id';

//get individual rows of people
public function getPerson($id)
{
    $id = (int)$id;
    $row = $this->fetchRow('person_id = ' . $id);
    if(!$row) {
        throw new Exception("Could not find row $id");
    }
    return $row->toArray();
}

//adding new persons
public function addPerson($firstName, $lastName, $cityId, $stateId, $countryId, $dob, $zip)
{
    $data = array(
        'first_name' => $firstName,
        'last_name' => $lastName,
        'city_id'   => $cityId,
        'state_id'  => $stateId,
        'country_id'    =>  $countryId,
        'dob'   =>   $dob,
        'zip'   =>  $zip,
    );
    $this->insert($data);
}

//updating an existing person
public function updatePerson($id, $firstName, $lastName, $cityId, $stateId, $countryId, $dob, $zip)
{
    $data = array(
        'first_name' => $firstName,
        'last_name' => $lastName,
        'city_id'   => $cityId,
        'state_id'  => $stateId,
        'country_id'    =>  $countryId,
        'dob'   =>   $dob,
        'zip'   =>  $zip,
    );
    $this->update($data, 'person_id = '. (int)$id);
}

//deleting a person
public function deletePerson($id)
{
    $this->delete('person_id = ' . (int)$id);
}
} 

Я также приложил изображение того, на что я смотрю с точки зрения пользовательского интерфейса. Если я смогу это понять, эта концепция поможет мне продвинуться дальше в развитии.

Я хочу избегать использования select (); и сосредоточиться на коде Zend, я знаю, как сделать это с базовым SQL, но я пытаюсь изучить всю инфраструктуру MVC.

http://imageshack.us/photo/my-images/29/screenshot20110705at711.png/

Также вот мой код контроллера:

<?php

class PersonController extends Zend_Controller_Action
{

public function init()
{
    /* Initialize action controller here */
}

public function indexAction()
{
    $person = new Application_Model_DbTable_Person();
    $this->view->person = $person->fetchAll();
}

public function addAction()
{
    // action body
}

public function editAction()
{
    // action body
}

public function deleteAction()
{
    // action body
}
}

1 Ответ

4 голосов
/ 06 июля 2011

Просто быстро, что я наблюдал.

Исходя из предоставленного вами кода, я предполагаю, что вы определили зависимые таблицы для города, штата и страны, то есть они должны указывать модель человека как зависимую.

Один из способов для решения вашей проблемы - определить пользовательский класс строк для человека, например

class My_Model_Table_Row_Person extends Zend_Db_Table_Row_Abstract {    

    /**
     * Get City Row for the current person row.
     *
     * @return Zend_Db_Table_Row
     */
    public function getCity() {
        return $this->findParentRow('Application_Model_DbTable_City');
    }

    // similar for State and Country
}

А в вашей модели Person:

class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract {
   // need to add this
   protected $_rowClass = 'My_Model_Table_Row_Person';
}

При этом метод fethAll в вашем действии будет возвращать наборы строк экземпляров My_Model_Table_Row_Person.Тогда для каждой строки вы можете легко получить родительские таблицы человека следующим образом:

$personRowset = $person->fetchAll();
foreach($personRowset as $person) {
   $cityName = $person->getCity()->name;    
}

Второй способ состоит в том, чтобы определить VIEW в вашей базе данных, в которой есть нужные вам столбцы иВы бы определили модель ZF дБ для представления.ZF не заботится о том, работает ли он с реальными таблицами или представлениями, если он знает первичный идентификатор (в модели для представления вам необходимо определить первичный ключ, т. Е. protected $_primary = array('id');).

Третий способ - выполнить запрос JOIN sql в вашей модели Person, например:

  class Application_Model_DbTable_Person extends Zend_Db_Table_Abstract {

     /**
     * Get all persons and their data 
     * 
     * @return Zend_Db_Table_Rowset
     */
    public function fetchAllPersons() {

        $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
                ->setIntegrityCheck(false);

        $select->joinInner('CITY', 'PERSON.city_id = CITY.id', 'CITY.name as cityName')
                 ->joinInner('SATE', 'PERSON.state_id = STATE.id', 'STATE.name as stateName');
                 ->joinInner('COUNTRY', 'PERSON.country_id = COUNTRY.id', 'COUNTRY.name as countryName');


        return $this->fetchAll($select);    
    }

Надеюсь, это поможет.

...