2014-12-04 7 views
1

Я использую CodeIgniter для создания веб-сайта, и я хочу показать список строительных проектов из таблицы базы данных, которые мы просто будем называть project_table. Для каждого проекта у меня также есть адрес, хранящийся в другой таблице, address_table, каждый адрес имеет project_id, который связывает его с проектом.Реляционные базы данных и CodeIgniter

Я сделал функцию, get_projects, в моей модели проектов, который используется для получения информации о проекте и передать его в представление проекта, как, например:

public function index() { 
    $data['projects'] = $this->project_model->get_projects(); 
    $data['title'] = 'Ejendomme'; 
    $this->load->view('templates/header', $data); 
    $this->load->view('projects/index', $data); 
    $this->load->view('templates/footer'); 
} 

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

Обновление: По желанию здесь функция get_project(), которая получает информацию о проекте из базы данных. Я рассмотрел вызов функции get_address() внутри этого, но я не уверен, как вернуть адреса из функции.

// Function to read all projects from database 
public function get_projects() { 
    $query = $this->db->get('project_table'); 
    return $query->result_array(); 
} 

ответ

2

Было более полезным, если вы отправили метод get_projects из моделей. В любом случае, трюк заключается в использовании архитектуры Model-View-Controller (MVC), поэтому вы помещаете в модель выбор из базы данных. Вот пример с методом, чтобы извлечь данные из этих двух таблиц:

public function get_projects() 
{ 
//for standard mySQL 
//select only the db fields that you need 
$query = "SELECT pt.*, at.* FROM project_table as pt, address_table as at WHERE pt.project_id = at.project_id"; 
$db_result = $this->db->query($query); 
$result_object = $db_result->result(); 
/* 
here you can add a check for the result (for instance to check if the return is not empty) 
*/ 
return $result_object; 
} 

Теперь разобрать результат с точки зрения и играть оттуда с данными.

+0

Благодарим за отзыв, я добавил код для моей функции get_projects(). Что означает pt. * И at'. *? что имена таблиц? (Ie project_table и address_table в моем примере) – Noceo

+0

pt. * Относится ко всем столбцам в таблице, на которые ссылается как «pt» (в примере, указанном выше, который является project_table) – Tim

+0

Я думаю, что я немного получу его сейчас (извините за то, что он медленный, Ранее я не видел этот синтаксис). Итак, как я буду обращаться к различным частям возвращаемого объекта результата? – Noceo

1

В идеале вы хотите сохранить все ваши запросы к базе данных в модели. Вы можете вызвать другие функции в своей модели, используя $ this-> function_name().

Я считаю, что это будет достичь того, что вы после (они идут в вашей модели):

// Function to read all projects from database 
public function get_projects() { 
    $results = $this->db->get('ed_projects')->result(); 
    foreach($results as $r) { 
     $r->address = $this->get_address($r->id); 
    } 
    return $results; 
} 

// Function to read addresses for a $project_id 
private function get_address($project_id) { 
    return $this->db->from('project_address_table') 
       ->where('project_id', $project_id) 
       ->get()->result(); 
} 

Я также рекомендую использовать CodeIgniter активный класс записи (http://www.codeigniter.com/user_guide/database/active_record.html) для выполнения простых запросов к базе данных, как это как это значительно упрощает просмотр вашего запроса

+0

Спасибо за ваш ответ. Я дам вам знать, если я заработаю :-) – Noceo

+0

Я могу получить его для чтения из базы данных, используя приведенный выше код, но когда я пытаюсь использовать код, я получаю сообщение об ошибке «Fatal error: Can not use object типа stdClass как массив в (...) ". Вероятно, я должен упомянуть, что project_address_table содержит несколько полей. Возможно ли организовать эти поля вместе с полями в get_project(), прежде чем возвращать все это как массив? – Noceo

+1

Вы можете выбрать, какие поля вернуться, добавив '-> select ('field1, field2, field3')' после '$ this-> db'. Вы можете вернуть функцию get_address в виде массива, изменив '-> result()' на '-> result_array()' то же, что и в вашей первой функции. Извините, что ошибка произошла, как в моем примере выше. Я изменил свою первую функцию, чтобы возвратиться как объект - измените '$ r-> address' на' $ r ['address'] ', и это должно работать – Tim

2

При объединении идей предыдущих ответов вы можете использовать построитель запросов (используя имя CI 3), чтобы присоединиться к двум таблицам и вернуть всю необходимую информацию из этого метод в модели:

public function get_projects() { 
    $this->db->from('project_table'); 
    $this->db->join('adress_table', 'adress_table.project_id', 'project_table.id'); 

    return $this->db->get()->result_array(); 
} 

Вы можете узнать больше о классе QueryBuilder на documentation.

Смежные вопросы