Zend_Db: прикол с вызовом findParentRow()
2808
3
Сегодня споткнулся о такое явление:

Имеем 2 класса - наследника от Zend_Db_Table_Abstract, определяющих основную (T1 c FKey) таблицу со связью и родительскую таблицу (T2 на неё ссылается FK). Для поиска родительской записи вызываем T1::$row->findParentRow('ParentClass','Связь'), которая работает нормально, даже в случае когда в T1, FKey =null. Но работает ровно до первого метода T2::$id->update() к данным в родительской таблице. После чего выдается ошибка с номером [HY093] - типа неправильное указание параметров SQL-запроса из функции PDO-select или чего еще...

Вот куски кода:

class Tbl1 extends Zend_Db_Table_Abstract
{
protected $_name = 'students';
protected $_primary = 'id';
protected $_referenceMap = array( // Таблица правил связи.
'anMaster' => array(
'columns' => 'master_id',
'refTableClass' => 'DbMasters',
'refColumns' => 'id'
)
);

public function getList() {
$mtbl = new DbMasters; $master = new Zend_Db_Table_Row;
foreach($this->fetchAll() as $row) {
if ($row->master_id) { // иначе выдает ошибку SQLSTATE [HY093].
$master = $row->findParentRow('DbMasters', 'anMaster');
if (!$master) { throw new Exception('Err! master_id=' . row->master_id . ' not found in the parent table... please check data...'); }
} else {
$master->name = '-';
}

Как видно из кода - проблему решил просто обрамив вызов метода ->findParentRow(...); условным оператором по проверке значения внешнего ключа.

Прикол в том, что ошибка не вылезала в течении 2-х дней пока не начал тестить редактирование уже введенных данных в совсем другой модели... может уже всем и известна, а может кому пригодится... я еще только учусь писать на PHP+Mysql+Zend.
tolstopuz
Простите мою невежественность, а что это за зенд такой, я так понимаю - какой то движок БД. Можно кратко для общего развития его преимущества? А то вдруг что то мне нужное....
Дима553
Простите мою невежественность, а что это за зенд такой, я так понимаю - какой то движок БД. Можно кратко для общего развития его преимущества? А то вдруг что то мне нужное....
Это мощный PHP фреймворк. Подробную информацию можете получить на http://framework.zend.com/
Если вы веб-разработчик и ещё не слышали о нем, то сейчас самое время посмотреть в его сторону;)
Дима553
Как пока сам понял, Zend Framework - это огромная библиотека классов на PHP5 для разработки сайтов с использованием ООП и схемы МВК (Модель-Вид-Контроллер). Возможно полезна для сверхбольших проектов. Задачу "ознакомится и разобраться" получил как вариант испытательного срока для вхождения в работу после 15-и летнего перерыва...:улыб:

Недостатки, замеченные на сегодня (возможно даже пока недостатки):
1. Чрезмерное употребление техник ООП "где надо и не очень". В частности для фронт-контроллера. Он же создается в единственном экземпляре! Нафига класс, если не темплэйт?

2. Скудость документации. Практически вся документация построена по принципу "это можно сделать так". Пока еще не нашел нормального и полного описания классов и методов с полным и исчерпывающим описанием параметров. Всё что описано - кусками по разным частям доков. Но это жа замечание отношу и к самому PHP. Синтаксических диаграмм языка - так и не нашел. Т.е. это - не язык программирования. Впрочем и к HTML - частично относится. Похоже что прошедшие 15-лет, программирование и обучение оному сильно изменилось. Крайне распространенным стал "обезъяний" метод обучения "делай так и будет счастье".

3. Перегруженность возможностями. Многие вещи можно делать 3-6 разными спсобами с использованием разного уровня абстракции.

4. Модель МВК в реализации Zend - это достаточно сложная структура из каталогов, файлов и именования классов и прочей лабуды... Для реализации сайта, обслуживающего СУБД из 3-х таблиц с суммарно 12-ю полями (в т.ч. и ключи) и 3 страницы доступа - мне потребовалось создать и разложить 15 каталогов и 21 файл. Самое что интересное, полностью отделить элементы модели друг от друга не удается даже в таком простом примере!

Достоинства: пока вижу только очень грамотный и продуманный подход к реализации. На верхних уровнях доступа (как раз о findParentRow() ) - скорость работы явно оставляет желать лучшего, зато очень хорошо решена проблема абстракции данных. Фактически всю структуру СУБД можно полностью реализовать наследуясь от классов раздела Zend_Db и имея техники PHP-ООП для работы с базой вместо sql-запросов. Практически всю генерацию кода страницы можно провести с помощью Zend_View, Layout и Zend_Form.