Добавить имя таблицы в каждое поле выбора в запросе в гибком
У меня проблема с определенным сгенерированным запросом, запрос выполняет внутреннее соединение с таблицей, имеющей то же поле.
Как я могу иметь запрос с именем таблицы в каждом поле, в основном то, что я хочу, это:
Преобразуйте это:
select "list_id", "date_time","plate"...
TO:
select register."list_id", register."date_time",register."plate"...
Я думаю, что с псевдонимом к имени поля также может быть достигнуто, но я не знаю, как добавить псевдоним в atk4
Если кто-то хочет увидеть полный запрос и ошибку atk:
Ошибка приложения: сбой запроса к базе данных
Exception_DB, код: 0
Дополнительная информация:
pdo_error: SQLSTATE[42702]: Ambiguous column: 7 ERROR: column reference "date_time" is ambiguous LINE 1: select "date_time","plate",(select "name" from "lane" whe... ^
mode: select
params:
query: select "date_time","plate",(select "name" from "lane" where "register"."lane_id" = "lane"."id" ) "lane",(select "name" from "camera" where "register"."camera_id" = "camera"."id" ) "camera",(select "detail"."id" from "detail" where "register"."detail_id" = "detail"."id" ) "detail","id","lane_id","camera_id","detail_id" from "register" inner join "detail" on "detail"."id" = "register"."detail_id" order by (select "detail"."id" from "detail" where "register"."detail_id" = "detail"."id" )
Вот как я делаю модель. Эта модель имеет 3 связанных поля в других таблицах, с которыми все в порядке. Но я хочу иметь еще одно поле (имя поля из таблицы List), и List не имеет прямого отношения к Register, связан только с деталями. Таким образом, я должен получить это через Регистр-> Деталь-> Список..
Регистр таблицы (id, табличка, detail_id,..)---->hasOne(detail_id)-> Таблица детали (id, list_id, date..)---->hasOne(list_id)----> таблица Список (номер, имя,..)
модель класса:
class Model_Register extends Model_Table {
public $table='register';
function init(){
parent::init();
$this->addField('date_time')->sortable(true)->defaultValue(date('Y-m-d H:m:i'))->type('date')->mandatory(true);
$this->addField('plate')->sortable(true)->mandatory(true);
$this->hasOne('Lane', 'lane_id')->sortable(true)->system(true);
$this->hasOne('Camera', 'camera_id')->sortable(true);
$this->hasOne('Detail', 'detail_id')->sortable(true);
}
}
И после того, как в классе страницы я делаю соединение, да, я знаю, что детали в данный момент излишни, я только пытаюсь...
$register = $crud->setModel('Register');
$q = $register->_dsql();
$q->join('detail', 'detail_id', 'inner');
$q->join('list', 'list_id', 'inner');
Как я могу получить это поле из поля списка? Любое решение будет приветствоваться..
Спасибо за совет!! Я ломаю голову этим!;)
2 ответа
Спасибо за ваше время, ребята, наконец-то я нашел решение с помощью названных: цепных соединений
Пример из документации:
$perm = $this->join('permission');
$res = $perm->join('resource');
Верьте или нет, это была моя настоящая проблема! Все равно спасибо
Попробуйте добавить свойство table_alias для ваших моделей
class Model_Yours extends Model_Table {
public $table_alias = '_alias';
}
Значение по умолчанию для этого свойства - null - ссылка
Так что, если вы добавите какое-либо значение, оно может быть использовано здесь
Не уверен, поможет ли это:(
$t1 = $this->add('Main_Table');
$t2 = $t1->leftJoin('joined_table_name');
$t2->addField('joined_table_field_ALIAS','joined_table_field_REALNAME');