Получение результатов формируют запрос для вставки в другие, используя активные записи - PullRequest
2 голосов
/ 15 мая 2011

Мне нужно получить все дочерние категории из заданных для использования в where_in с активными записями codeigniter.

Проблема в том, что второй запрос смешивается с основным, полностью его нарушая.

Основной запрос

$this->db->select('artworks.*, users.id as owner, users.name as user_name');
$this->db->from('artworks');
$this->db->join('users', 'users.id = artworks.user_id');

$category = $this->get_child_categories($this->get_categories(), $matches[1]);
$this->db->where_in('artworks.category', $this->category['child']);

$this->db->group_by('artworks.id');
$query = $this->db->get();
return $query->result_array();

Второй запрос "get_categories ()"

$this->db->select('*');
$this->db->order_by('parent', 'asc');
$this->db->order_by('name', 'asc');
$query = $this->db->get('categories');
return $query->result_array();

get_child_categories

function get_child_categories($categories, $parent){
    foreach($categories as $category){
        if($category['parent'] == $parent){
            array_push($this->category['childs'], $category['id']);
            $this->get_child_categories($categories, $category['id']);
        }
    }
}

Но я получаю эту ошибкугде отчетливо видно, что второй запрос заключен внутри основного запроса.

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM (`artworks`, `categories`) JOIN `users` ON `users`.`id` = `artworks`.`use' at line 1

SELECT `artworks`.*, `users`.`id` as user_id, `users`.`name` as user_name, * FROM (`artworks`, `categories`) JOIN `users` ON `users`.`id` = `artworks`.`user_id` WHERE `artworks`.`rating` IN ('g', 'm', 'a') ORDER BY `artworks`.`id` desc, `parent` asc, `name` asc

Filename: D:\Server\htdocs\gallery\system\database\DB_driver.php

Line Number: 330

1 Ответ

3 голосов
/ 15 мая 2011

Лично я считаю, что это ошибка в подходе CodeIgniter к активной записи, если он вообще должен следовать шаблону активной записи.Он должен полностью обеспечивать выполнение любого из этих:

  • запросов, содержащихся в одном контексте данных
  • запросов, указанных в элементарной инструкции

Ни как ни один из этихпроисходит, когда вы неохотно смешиваете два запроса со структурой, которую CodeIgniter не поддерживает, создавая таким образом недопустимый запрос.

Для простого решения я бы предложил вам изменить порядок следованияинструкции, чтобы запросы выполнялись отдельно.

$category = $this->get_child_categories($this->get_categories(), $matches[1]);
# the first query gets executed here, your data context is cleaned up

$this->db->select('artworks.*, users.id as owner, users.name as user_name');
$this->db->from('artworks');
$this->db->join('users', 'users.id = artworks.user_id');
$this->db->where_in('artworks.category', $this->category['child']);
$this->db->group_by('artworks.id');
$query = $this->db->get();
# your second query gets executed here
return $query->result_array();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...