Я использую CodeIgniter для создания веб-сайта и хочу показать список строительных проектов из таблицы базы данных, которую мы просто назовем project_table
, Для каждого проекта у меня также есть адрес, сохраненный в другой таблице, address_table
каждый адрес имеет project_id
, который связывает его с проектом.
Я сделал функцию 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();
}
Было бы более полезно, если вы опубликовали метод 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;
}
Теперь проанализируйте результат и просмотрите данные.
Объединяя идеи из предыдущих ответов, вы можете использовать построитель запросов (используя имя 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 на документация.
В идеале вы хотите сохранить все ваши запросы к базе данных в модели. Вы можете вызывать другие функции в вашей модели, используя $ 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) для выполнения простых запросов к базе данных, таких как это, так как намного проще увидеть, что делает ваш запрос