YII 1.x проблеми в роботі з реляційною AR

Dec 05, 2013 13:15

SQLSTATE[23000]: Integrity constraint violation: 1052
Такий надпис інколи можна побачити при роботі з таблицями, в яких є стовбці з однаковими назвами. Проблема виникає, коли YII будує SQL-запрос. Тобто ось приклад виникнення проблеми. В контролеры маэм такий код:

public function actionTriggerHistory($ip, $line)
{
$params=null;
$trigger=SnmpIolinedevs::model()->with('ats')->find('ip=? AND line_num=?', array($ip, $line));
$params['trigger']=$trigger;

$model=new SnmpIoLog('search');
$model->ip=$ip;
$model->line_num=$line;
$params['dp']=$model;

$this->render('triggerHistory', array('params'=>$params));
}
Варто звернути увагу на виділений жирним фрагмент коду, де задається умова вибірки find('ip=? AND line_num=?', array($ip, $line))
Саме після виконання даного коду, YII нам видасть помилку:
CDbException
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'ip' in where clause is ambiguous. The SQL statement executed was: SELECT `t`.`id_d` AS `t0_c0`, `t`.`ip` AS `t0_c1`, `t`.`line_num` AS `t0_c2`, `t`.`descr` AS `t0_c3`, `ats`.`id_sa` AS `t1_c0`, `ats`.`id_pl` AS `t1_c1`, `ats`.`ip` AS `t1_c2`, `ats`.`descr` AS `t1_c3` FROM `snmp_iolinedevs` `t` LEFT OUTER JOIN `snmp_ats` `ats` ON (`t`.`ip`=`ats`.`ip`) WHERE (ip=? AND line_num=?)
Виділений фрагмент SQL-запросу і є причиною даної проблеми. Ця проблема виникає через те, що в обох таблицях є стовбці з однаковими назвами, гото мускуль не знає, що ми від нього хочемо і матю кається =). Для того, щоб уникнути цієї помилки, нам потрібно уточнити запрос. В результаті звернення до моделі в нас буде виглядати таким чином:

$trigger=SnmpIolinedevs::model()->with('ats')->find('t.ip=? AND t.line_num=?', array($ip, $line));
Бачимо що даний приклад прекрасно працює =) Справа в тому, що при трансформації коду в SQL-запрос, основна таблиця в нас ЗАВЖДИ отримує псевдонім t, а реляційні моделі отримують ту назву, яку ми задекларували в моделі у функції relations()
Більш детально з даною темою модна ознайомитись тут: http://yiiframework.ru/doc/guide/ru/database.arr в розділі Устранение конфликта имён столбцов

ar, 1052, ошибки, sqlstate[23000], sql, php, model, конфликт столбцов, yii, controller

Previous post Next post
Up