powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [kohana] Возможность объединения запроса в ORM::factory
20 сообщений из 20, страница 1 из 1
[kohana] Возможность объединения запроса в ORM::factory
    #38779046
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток уважаемые форумчане,
В kohana, есть замечательная штука получения строки, по id
Например:
Код: php
1.
$one_department_a = ORM::factory ('department', $id);


Вопрос:
Можно каким –либо образом переделать соответствующую модель, чтоб приведенный выше код, возвращал запрос:
Код: sql
1.
2.
SELECT * FROM departments WHERE id=2 or id=(
SELECT main_dep_id FROM departments WHERE id=2)


Просмотрев код «factory» - там можно задавать только массив с полей, для одной строки.

Спасибо
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38779058
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А то получается так, что для получения инф-ции по двум строкам из одной таблицы, мне приходится обращаться 2 раза к БД:
Код: php
1.
2.
$one_department_a = ORM::factory('department', $id)->as_array(); //получение инф-ции дной строки
$data['dep'] = ORM::factory('department', $data['main_dep_id'])->as_array(); //получение инф-ции связанной с первой строкой
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38779089
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не туда смотрел!

$sub_sql = DB::select('main_dep_id')->from('departments')->where('id','=',2);
ORM::factory('table')->where('id','=',2)->or_where('id','IN',DB::expr($sub_sql))->find_all();

не ручаюсь за правильность синтаксиса..но както так
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38779200
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только вторую строку немного переделал

Код: sql
1.
2.
$sub_sql = DB::select('main_dep_id')->from('departments')->where('id','=',$id);
$sub_sql1 = ORM::factory('department')->where('id','=',$id)->or_where('id','=', '('||DB::expr($sub_sql)||')')->find_all()->as_array();



В результате она выглядит следующим образом (при $id=24):
Код: sql
1.
2.
3.
4.
5.
SELECT `department`.`id` AS `id`, 
`department`.`name` AS `name`, 
`department`.`main_dep_id` AS `main_dep_id`, 
FROM `departments` AS `department` 
WHERE `id` = 24 OR `id` = (SELECT `main_dep_id` FROM `departments` WHERE `id` = 24)


запрос рабочий. В "phpmyadmin" проверял.

Вывод на экран переменной "$sub_sql" - все отлично (н-р: " SELECT `main_dep_id` FROM `departments` WHERE `id` = 24 ")
Но при выводе "$sub_sql1", в переменной, почему-то не правильно вычисляется DB::expr($sub_sql)
SELECT `department`.`id` AS `id`,
`department`.`name` AS `name`,
`department`.`main_dep_id` AS `main_dep_id`,
FROM `departments` AS `department` WHERE `id` = 24 OR `id` = '1
'

в то время, когда `id` должно равнятся "23"
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38779562
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010только вторую строку немного переделал

Код: sql
1.
2.
$sub_sql = DB::select('main_dep_id')->from('departments')->where('id','=',$id);
$sub_sql1 = ORM::factory('department')->where('id','=',$id)->or_where('id','=', '('||DB::expr($sub_sql)||')')->find_all()->as_array();



В результате она выглядит следующим образом (при $id=24):
Код: sql
1.
2.
3.
4.
5.
SELECT `department`.`id` AS `id`, 
`department`.`name` AS `name`, 
`department`.`main_dep_id` AS `main_dep_id`, 
FROM `departments` AS `department` 
WHERE `id` = 24 OR `id` = (SELECT `main_dep_id` FROM `departments` WHERE `id` = 24)


запрос рабочий. В "phpmyadmin" проверял.

Вывод на экран переменной "$sub_sql" - все отлично (н-р: " SELECT `main_dep_id` FROM `departments` WHERE `id` = 24 ")
Но при выводе "$sub_sql1", в переменной, почему-то не правильно вычисляется DB::expr($sub_sql)
SELECT `department`.`id` AS `id`,
`department`.`name` AS `name`,
`department`.`main_dep_id` AS `main_dep_id`,
FROM `departments` AS `department` WHERE `id` = 24 OR `id` = '1
'

в то время, когда `id` должно равнятся "23"

во первых никогда не пиши id = (select)... лучше всётаки id IN (select) ибо там может быть не одна строчка результата.

нащот DB::expr
насколько я понмю..туда ты пишешь текст, который будет как есть

тоесть
where('id','=','field2') даст в результате `id` = 'field2' ---равно константе
where('id','=',DB::expr('field2')) - `id` = field2 ---тоесть значению другого поля.

может єто не екпр а другой метод...я перепутал, но суть в том, чтобы оно не пощитало сабкфери просто текстом и не обрамило в кавычки... вот какая у меня была идея.
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38780143
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, про "IN" и "=" я помню (но в моем случае привязанная запись всего одна - всегда).
Вот только не понятно, почему "DB::expr($sub_sql)" (поищем другой метод) в "$sub_sql1" - не правильный результат выдает.
Может в дебаге NetBeans, удастся отследить
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38780516
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я так и не понял в чом не правильность подзапроса
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38780522
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подзапрос в отдельности работает замечательно:
Код: sql
1.
$sub_sql = DB::select('main_dep_id')->from('departments')->where('id','=',$id)->execute()->as_array();


Результат:
Код: php
1.
Array ( [0] => Array ( [main_dep_id] => 23 ) )



А если работает в составном запросе:
Код: sql
1.
$sub_sql1 = ORM::factory('department')->where('id','=',$id)->or_where('id','=', '('||DB::expr($sub_sql)||')')->find_all()->as_array();



Подзапрос выдает результатом "1" , а не "23" (наверно обращатся к нему нужно по другому)
Код: sql
1.
...FROM `departments` AS `department` WHERE `id` = 24 OR `id` = '1' 
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38780740
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оставил модуль ORM в покое
и воспользовался старым добрым DB:
Код: sql
1.
2.
3.
$sub_sql4 = DB::query(Database::SELECT, 'SELECT id, abbreviation, name, main_dep_id, status, user_id, hierarchical_dep FROM departments WHERE id = :id OR id = (select main_dep_id from departments where id = :id)');
 $sub_sql4->param(':id', $id);
 $sub_sql4 = $sub_sql4->execute()->as_array()



- :-) и сразу получил все, что хотел, в виде массива.
Осталось научиться добавлять результатам в массиве имена, а то [0] и [1] как-то не очень?

Ведь DB и ORM по сути одинаковы.
Это от вкуса уже зависит, как обращаться к БД
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38781589
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010Оставил модуль ORM в покое
и воспользовался старым добрым DB:
Код: sql
1.
2.
3.
$sub_sql4 = DB::query(Database::SELECT, 'SELECT id, abbreviation, name, main_dep_id, status, user_id, hierarchical_dep FROM departments WHERE id = :id OR id = (select main_dep_id from departments where id = :id)');
 $sub_sql4->param(':id', $id);
 $sub_sql4 = $sub_sql4->execute()->as_array()



- :-) и сразу получил все, что хотел, в виде массива.
Осталось научиться добавлять результатам в массиве имена, а то [0] и [1] как-то не очень?

Ведь DB и ORM по сути одинаковы.
Это от вкуса уже зависит, как обращаться к БД

ты лудше всятаки разберись в чом проблема...
насколько я понмю, метод execute() возвращает обьект Database_result
и у этого обьекта всегда в поле query или както так, храниться строка - каким имено запросом в базу получен этот результат..это строка уже со всеми подстановками...именно то что пошло в базу! посмотрев на неё точно поймёшь где что не так.

наравне с методом as_array() там есть метод получения асоциативного масива...

плюс в методе селект можно задавать выборку
select('f1','f2',...,'fn')
а можно
select(array('field1','psevdonim_field1_inresult'),array(..)..)
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38781665
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтото ты напутал.

кохана была на локалхосте... попробовал.

1
Код: php
1.
2.
3.
$sql = DB::select('idap_file')->from('ap_files')->where('idap_file', '=', 1000000);
$result = $sql->execute()->as_array();
//получим как и ожидаем в $result[0] значение 1000000



2
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$sql = DB::select('idap_file')->from('ap_files')->where('idap_file', '=', 1000000);

$list = ORM::factory('apfile')->where('idap_file', '=', '1000111')
				->or_where('idap_file', 'IN', DB::expr('('.$sql->compile().')'))->find_all();

//тоесть теперь ожидаем получить две записи - милионную и милион-сто-одинадцатую
var_dump($list);
//видим скл который ожидали


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
`apfile`.`idap_file` AS `idap_file`, 
`apfile`.`user_id` AS `user_id`, 
`apfile`.`ts` AS `ts`, 
apfile`.`path` AS `path`, 
`apfile`.`result` AS `result`, 
`apfile`.`requestid` AS `requestid`, 
`apfile`.`nodeid` AS `nodeid`, 
`apfile`.`ip` AS `ip`,
 `apfile`.`fk_idgeo_location` AS `fk_idgeo_location` 
FROM `ap_files` AS `apfile` 
WHERE `idap_file` = '1000111' OR 
`idap_file` IN (SELECT `idap_file` FROM `ap_files` WHERE `idap_file` = 1000000)



Код: php
1.
2.
3.
4.
foreach($list->as_array() as $item)
{
	var_dump($item->as_array());
}


получаем тоже что ожидаем...два масива для двух записей!!
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38783390
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

Да, получилось, спасибо.
Ошибка была в пропуске команды выполнения:
у меня было:
Код: sql
1.
...'('||DB::expr($sub_sql)||')'


а вы написали:
Код: sql
1.
...DB::expr('('.$sub_sql->compile().')')


т.е. нужно было запрос выполнить и вернуть значение
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38783554
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще такой один вопрос:
в результате всей этих действий (этого запроса), у меня получается многомерный массив, в котором: первый ключ - это номер строки (всего - [0] и [1]), ну а второй (подмассив) - это собственно содержимое строки.
Как можно преобразовать первый ключ, например в "id" строки? Или лучше присваивать подмассивам имена? (а то массивы местами переставляются (при выполнении запроса), и на web страничке, получается путаница данных)
Только без предварительного преобразования в другой массив,
например ($one_department_a2 - результат запроса):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
foreach($one_department_a2 as $abbreviation)
{
    if ($abbreviation->id == $id)
    {    
    $one_department_a['dep']['id']  = $abbreviation->id;
    $one_department_a['dep']['abbreviation']  = $abbreviation->abbreviation;
    $one_department_a['dep']['name']  = $abbreviation->name;
    $one_department_a['dep']['main_dep_id']  = $abbreviation->main_dep_id;
    $one_department_a['dep']['status']  = $abbreviation->status;
    }
    else 
    {
     $one_department_a['mainDep']['id']  = $abbreviation->id;
     $one_department_a['mainDep']['abbreviation']  = $abbreviation->abbreviation;
     $one_department_a['mainDep']['name']  = $abbreviation->name;
     $one_department_a['mainDep']['main_dep_id']  = $abbreviation->main_dep_id;
     $one_department_a['mainDep']['status']  = $abbreviation->status;
    }    
    
}    
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38783956
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010alex564657498765453,

Да, получилось, спасибо.
Ошибка была в пропуске команды выполнения:
у меня было:
Код: sql
1.
...'('||DB::expr($sub_sql)||')'


а вы написали:
Код: sql
1.
...DB::expr('('.$sub_sql->compile().')')


т.е. нужно было запрос выполнить и вернуть значение

я думаю ключевой момент это палочки вместо точек??? они зачем.

$sub_sql->compile()
насколько я помню, все что делаеться билдквери при преобразовании в строку вызываеться метод магический __тустринг который и вызывает компайл...это для наглядности я написал
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38783963
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010А еще такой один вопрос:
в результате всей этих действий (этого запроса), у меня получается многомерный массив, в котором: первый ключ - это номер строки (всего - [0] и [1]), ну а второй (подмассив) - это собственно содержимое строки.
Как можно преобразовать первый ключ, например в "id" строки? Или лучше присваивать подмассивам имена? (а то массивы местами переставляются (при выполнении запроса), и на web страничке, получается путаница данных)
Только без предварительного преобразования в другой массив,
например ($one_department_a2 - результат запроса):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
foreach($one_department_a2 as $abbreviation)
{
    if ($abbreviation->id == $id)
    {    
    $one_department_a['dep']['id']  = $abbreviation->id;
    $one_department_a['dep']['abbreviation']  = $abbreviation->abbreviation;
    $one_department_a['dep']['name']  = $abbreviation->name;
    $one_department_a['dep']['main_dep_id']  = $abbreviation->main_dep_id;
    $one_department_a['dep']['status']  = $abbreviation->status;
    }
    else 
    {
     $one_department_a['mainDep']['id']  = $abbreviation->id;
     $one_department_a['mainDep']['abbreviation']  = $abbreviation->abbreviation;
     $one_department_a['mainDep']['name']  = $abbreviation->name;
     $one_department_a['mainDep']['main_dep_id']  = $abbreviation->main_dep_id;
     $one_department_a['mainDep']['status']  = $abbreviation->status;
    }    
    
}    



пример кода не понятен

2. рузультат запроса - строкИ, тоесть масив елементов, каждый елемент строка
строка - это набор полЕЙ, тоесть строка это масив елементов , где каждый елемент поле...

а в каком виде оно должно было вернуть как не многомерный масив?

3
помниться там есть какойто метод - но это форичем перестройка масива, чтобы индексами строк были не 0 1 2 3 ... а значение определёного поля.
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38783968
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плин. а документацию то иногда полезно читать...
к
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38784179
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453
я думаю ключевой момент это палочки вместо точек??? они зачем.


Да, "compile()", тут ни причем (странно в какой-то момент мне показалось, что это тоже тут причем - глюки наверное),
а вот в палочках - вы правы,
да и не палочки это вовсе, а знак конкантинации (я раньше в Interbase и Firebird запросы писал, вот с тех пор и привязалось)
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38784220
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453...пример кода не понятен

Да пример не нагляден. Все просто:
этот массив я передаю в view, а поскольку запрос получает инф. о двух отделах (2 строки - 2 подмассива [0] и [1]) основном и подчиненном, то мне необходимо знать, какой подмассив (они иногда местами меняются) за какой отдел отвечает.
чтоб допустим я правильно выводил инф. в view о основном отделе, например:
Код: html
1.
2.
3.
4.
...
td width="100%"><?=Form::label('name', 'Полное название')?>:</td>
<td><?=Form::input('name', $one_department_a['dep']['name'], array('size' => 50))?></td>
...


и подчиненном отделе:
Код: html
1.
2.
3.
4.
5.
6.
...
<td><?=Form::label('name', 'Подчиненный отдел')?>:</td>
        <td>
            <?=Form::select('dep', $departments_a1, $one_department_a['mainDep']['id'], array('size' => 1))?><br/><br/>
        </td>
...
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38784338
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так по ссылке прочитал как вызываеться метод as_array() ???

плюс сортировать можно, плюс можно обработать масив и уже во вьюху передавать отдельно переменные две

$row_department , $row_sub_department
...
Рейтинг: 0 / 0
[kohana] Возможность объединения запроса в ORM::factory
    #38784375
Kos-2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

Да уже прочел, но вчерась уже обработал массив (код вверху) - все работает :-).
Можно и две переменных, можно и один двумерный массив, и во вьюхе уже обращаться к определенному
Код: html
1.
<?=Form::select('dep', $departments_a1, $one_department_a['mainDep']['id'], array('size' => 1))?><br/><br/>



Я просто думал можно это как-то в запросе устроить , чтоб не возиться с переработкой результата (массива)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [kohana] Возможность объединения запроса в ORM::factory
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]