SQL-соединение в CodeIgniter с активной записью - PullRequest
6 голосов
/ 17 февраля 2012

Я пытаюсь обернуть голову вокруг этого, но я, кажется, иду кругами.Я пытаюсь перечислить темы пользователей одну за другой с цитатами, относящимися к этой конкретной теме.Если это имеет смысл.

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

[ПОЛЬЗОВАТЕЛИ] user_id username

[TOPICS] topic_id user_id user_id topic_name

[QUOTES] quote_id topic_id quote_name

Я хочу иметь возможность сделать что-то подобное на мой взгляд:

Имя пользователя: Thomas

Тема 1: Что бы то ни было

Цитаты: одна цитата, другая цитата и третья цитата, все принадлежат теме 1.

Тема 2: Другая тема от Томаса

Цитаты: Да, действительно, хорошо, спасибо, я люблю переполнение стека, эти цитаты относятся к теме 2.

Но я не могу заставить его работать, я пробовал все, включая странныетакие вещи, как:

public function get_quotes()
{

    $this->db->select('*');
    $this->db->from('topics');
    $this->db->join('quotes', 'topic_id = quote_id');

    $query = $this->db->get();

    if($query->num_rows() > 0)
    {
        foreach ($query->result() as $row) {
            $data[] = $row;
        }
    }
    return $data;
}

Странно, стоит ли мне вместо этого использовать «где»?Что-то вроде:

$this->db->where('user', $user_id);
$this->db->where('topic', $topic_id);
$this->db->where('quote', $quote_id);

Я очень ценю любую помощь, которую я могу получить, или просто указание пальцем в правильном направлении!

Ответы [ 2 ]

10 голосов
/ 17 февраля 2012

Сразу же я бы спросил "Что не работает?" , во-вторых, я бы предложил вам запустить профилировщик, чтобы показать генерируемый EXACT SQL , чтобы вы может сделать правильную оценку того, где ACTIVE QUERY вам не удается.

Чтобы использовать профилировщик, вставьте это в свой контроллер:

$this->output->enable_profiler(TRUE);

Это приведет к хорошему выводу всех вызовов БД, всех переменных POST и т. Д .;
Ссылка здесь: http://codeigniter.com/user_guide/libraries/output.html

ОБНОВЛЕНИЕ

Итак, чтобы полностью сделать то, что вы хотите, вам нужен запрос, который возвращает следующие столбцы:

user_id, username, topic_id, topic_name, quote_id, quote_name

Вот активный запрос, который вы хотите (вы также можете использовать цепочку методов, если это достаточно ясно):

$this->db->select('u.user_id, u.username, t.topic_id, t.topic_name, q.quote_id, q.quote_name');
$this->db->from('users u');
$this->db->join('topics t', 't.user_id = u.user_id'); // this joins the user table to topics
$this->db->join('quotes q', 'q.topic_id = t.topic_id'); // this joins the quote table to the topics table
$query = $this->db->get();

Ваш набор результатов будет примерно таким:

user_id     | username  | topic_id  | topic_name    | quote_id  | quote_name
1           |Thomas     |1          |Whatever       |1          |One quote, anot...
2           |Ryan       |4          |Another...     |6          |To be or not to...

Как только у вас будет этот набор результатов, просто переберите данные, чтобы вывести их, и проверьте, есть ли у вас несколько кавычек от одного человека (например, сортируйте по user_id и выполните тест во втором цикле, если это один и тот же человек в противном случае выведите имя нового пользователя).

1 голос
/ 17 февраля 2012

Если вы хотите все цитаты для конкретного пользователя:

$this->db->join('TOPICS t', 'u.user_id on t.user_id')
         ->join('QUOTES q', 't.topic_id on q.topic_id')
         ->where('u.user_id', $userId)
         ->get('USERS u');

// I always echo my queries when developing to make sure they are what i'm expecting
echo $this->db->last_query();

Если вы хотите, чтобы все цитаты для всех пользователей

$this->db->join('TOPICS t', 'u.user_id on t.user_id')
         ->join('QUOTES q', 't.topic_id on q.topic_id')
         ->get('USERS u');

echo $this->db->last_query();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...