Zend найти ВСЕ зависимые строки - PullRequest
4 голосов
/ 20 октября 2011

Приведенный пример: "таблица-> человек" - "таблица-> книги" (использует-> person_id) - "таблица-> блокнот" (использует-> person_id)

В моих классах Zend я определяю все отношения от человека к книгам и тетради и наоборот. Теперь, если я хочу удалить этого человека, мое приложение должно убедиться, что у этого человека больше ничего нет (по крайней мере, это то, чего я хочу достичь).

Очевидно, с небольшим примером, я мог бы легко проверить if $person->hasBooks() || $person->hasNotebooks(), но по мере роста базы данных появляются обувь, штаны и очки и множество мелких вещей.

Есть ли ЛЮБОЙ, чтобы автоматизировать это как

foreach ( connectedGoods in person as theGood) 
{
  if ( person->hasGood( theGood ) ) {
    //log person still uses theGood
  } 
} 

Или мне все время приходится вручную проверять каждую «connectedGood»?

Чтобы уточнить: я знаю, как я могу findDepentendRowset('singleTable') - я просто хочу знать, если есть как findDepentendRowset('allDependentTables')

Заранее спасибо

// Редактировать Вот моя текущая структура таблицы, чтобы дать немного больше понимания:

tbl_buildings:
b_id
b_*

tbl_asset_x
a_id
b_id (tbl_buildings)

tbl_asset_y
y_id
b_id (tbl_buildings)

1 Ответ

2 голосов
/ 04 мая 2012

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

abstract class MyBaseTable extends Zend_Db_Table_Abstract {
    protected $_rowClass = 'MyBaseTableRow';
    public function getReferences() {
        return $this->_referenceMap;
    }
}

abstract class MyBaseTableRow extends Zend_Db_Table_Abstract {
    public function hasDependents() {
        foreach ($this->_getTable()->getReferences() as $entity => $info) {
            if (count($this->findDependentRowset($entity) > 0) {
                return true;
            }
        }
        return false;
    }
}

class Persons extends MyBaseTable {
    protected $_referenceMap    = array(
        'Book' => array(
            'columns'           => 'reported_by',
            'refTableClass'     => 'Books',
            'refColumns'        => 'account_name'
        ),
        'Notebook' => array(
            'columns'           => 'assigned_to',
            'refTableClass'     => 'Notebooks',
            'refColumns'        => 'account_name'
        )
    );
}

$persons = new Persons();
$person = $persons->find(1234);

if ($person->hasDependents()) {
    echo 'freaking remove assets first';    
} else {
    $person->delete();
}

Примечание: не проверено!

...