Codeigniter возвращает результат и строку - PullRequest
2 голосов
/ 06 июля 2011

В классе Model я использую return $query->row(); для возврата отдельных строк и return $query->result(); для возврата нескольких строк.

На одной странице мне нужно возвращать отдельные строки и несколько строк из 2 отдельных таблиц.

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

Мой запрос

        $this->db->select('*');
        $this->db->from('users');
        $this->db->join('user_links', "user_links.user_id = users.user_id");
        $this->db->where('users.user_id', $user_id);
        $this->db->where('user_links.user_id', $user_id);
        $query = $this->db->get();
        return $query->row(); 

В моем контроллере я загружаю запрос в моем представлении на

$data['row'] = $this->User_model->user_read($user_id);,

$user_id является третьим сегментом URL, содержащим уникальный идентификатор пользователя.

Наконец, на мой взгляд, я получаю строки по echo $row->first_name;

Это работает для отдельных строк, но как я могу создать цикл foreach для пользовательских ссылок? Цель состоит в том, чтобы избежать циклов для отдельных строк и использовать их только для извлечения нескольких строк.

Ответы [ 5 ]

5 голосов
/ 06 июля 2011

Это код psuedo, но вы можете сделать что-то вроде этого

    $this->db->select('*');
    $this->db->from('users');
    $this->db->join('user_links', "user_links.user_id = users.user_id");
    $this->db->where('users.user_id', $user_id);
    $this->db->where('user_links.user_id', $user_id);
    $query = $this->db->get();
    if ($query->num_rows() == 1)
    {
        return $query->row(); 
    }
    elseif ($query->num_rows() > 1)
    {
        return $query->result_array(); //This returns an array of results which you can whatever you need with it
    }
    else 
    {
         //Add some logic to handle if there are zero results
    }
2 голосов
/ 06 июля 2011

Если я правильно понимаю ваш вопрос, вы хотите получить как пользовательские данные, так и данные user_links с помощью одного запроса, избегая при этом повторения его для получения данных пользователя.Хотя это возможно при использовании result_array, я бы посоветовал против этого, поскольку вы получите 0 результатов, если в user_links для этого конкретного пользователя нет записей.

Я предлагаю вам использовать два запроса, один дляuser из таблицы user, другой для получения пользовательских ссылок из таблицы user_links.Это также поможет вам избежать объединений.

2 голосов
/ 06 июля 2011

Трудно сказать, что вы хотите.

Вам нужна функция, которая проверяет, передаете ли вы row() или result() и обрабатывает их соответствующим образом.

По моему мнению, ваш код будет легче читать (и поддерживать), если вы просто передадите все как result().И убедитесь, что набор пуст, чтобы показать пользователю приятное сообщение.

1 голос
/ 06 июля 2011

Звучит так, как будто вы ищете другие функции, уже предоставленные Active Record CI: http://codeigniter.com/user_guide/database/results.html

То, что вы делаете, звучит как использование встроенной функции result_array. Вы используете это так:

взято из ссылки выше

$query = $this->db->query("YOUR QUERY");

foreach ($query->result_array() as $row)
{
   echo $row['title'];
   echo $row['name'];
   echo $row['body'];
}
0 голосов
/ 17 августа 2014

Вы можете просто заменить эту строку:

$this->db->join('user_links', "user_links.user_id = users.user_id");

На эту:

$this->db->join('user_links', "user_links.user_id = users.user_id", 'left outer');

Объединение в codeigniter использует INNER JOIN по умолчанию, но в некоторых случаях, если нет данныхв user_links он ничего не возвращает, поэтому вы можете использовать LEFT JOIN в своей работе CI, которую он использовал, как я упоминал выше.

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