CodeIgniter: объединить таблицы и сохранить все строки из основной таблицы - PullRequest
0 голосов
/ 06 июля 2019

У меня есть четыре таблицы:

pages: id, all_content, all_posts [...]  
content: id, type [...]  
posts: id, content_id [...]  
pages_content: id, page_id, content_id, hidden

Учитывая определенный идентификатор страницы, я хочу получить все строки контента / сообщений, если pages.all_content или pages.all_posts установлены на 1.
Кроме того, я хочу получить все pages_content.hidden столбцы, в которых page_id == pages.id и строки содержимого / записей, связанные с ними, независимо от all_content / all_posts.

Я бы хотел использовать для этого функции базы данных CI.

Теперь это мой код; он возвращает только контент, представленный в таблице pages_content, но в остальном он дает ожидаемый результат, когда речь идет о значениях all_content / all_posts.

    $this->db->select('all_content, all_posts');
    $query = $this->db->get_where('pages', [ 'id' => $id ]);

    if ($query->num_rows())
    {
        $auto = $query->row();
        $query->free_result();

        $this->db->join('posts', 'posts.content_id = content.id');
        $this->db->join('pages_content', 'content.id = pages_content.content_id');

        $this->db->order_by('publish_date', 'DESC');
        $this->db->select('content.id, uri, hidden, type, title, publish_date');

        $this->db->where('pages_content.page_id', $id);
        $this->db->or_where('type = "posts" AND ('.$auto->all_content.' OR '.$auto->all_posts.')');

        $query = $this->db->get('content');
        $result = $query->result();
        $query->free_result();

        return $result;
    }

    $query->free_result();

    return FALSE;

1 Ответ

0 голосов
/ 06 июля 2019

После небольшого поиска я узнал о предложении LEFT JOIN, которое включает в себя все строки из "левой" таблицы (в данном случае content).
В CodeIgniter это делается путем добавления его в видеТретий параметр в методе join.

Так что, похоже, это решение:

    $this->db->select('all_content, all_posts');
    $query = $this->db->get_where('pages', [ 'id' => $id ]);

    if ($query->num_rows())
    {
        $auto = $query->row();
        $query->free_result();

        $this->db->join('pages_content', 'pages_content.content_id = content.id AND page_id = '.$id, 'left');
        $this->db->join('posts', 'posts.content_id = content.id', 'left');

        $this->db->order_by('publish_date', 'DESC');
        $this->db->select('content.id, uri, hidden, type, title, publish_date');

        if (!$auto->all_content)
        {
            $this->db->where('page_id', $id);
            if ($auto->all_posts) $this->db->or_where('type = "posts"');
        }

        $query = $this->db->get('content');
        $result = $query->result();
        $query->free_result();

        return $result;
    }

    return FALSE;

Хотя, вероятно, было бы лучше, если бы запрос pages был включен в основной запроса также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...