Code Igniter - чем больше я пытаюсь понять, тем больше я запутываюсь - PullRequest
1 голос
/ 10 июня 2011

Я понимаю, что делает MVC. но не понимаю достаточно глубоко.

 <?php
class Orders_model extends CI_Model {

         function  __construct(){

                parent::__construct();
        }
        private $table_name='orders';

         public function get(){


                $this->db->select('*');
                $this->db->from('orders');
                $this->db->join('orders_content', 'orders.oid = orders_content.oid');
                $query = $this->db->get();


                $data=array();
                foreach($q->result_array() as $orders){
                $data[$orders['orders.oid']] = $orders['orders_content.oid'];
                }

                return $data;
        }


}

?>

проблема в том, что у меня есть две таблицы: orders и orders_content. Я не уверен, смогу ли я просто соединить две таблицы и вызвать массив для сопоставления, если oid orders и oid orders_content одинаковы, а затем показать связанные данные.

In views / product_order.php

<table cellpadding="3" cellspacing="0" width="686">
          <tr>
            <th>Product ID</th>
            <th>Title</th>
            <th>Price</th>
            <th>Qty</th>

          </tr>
          <?php foreach($orders as $orders){?>
                  <tr>

                    <td><?php echo $orders->product_id;?></td>
                    <td><?php echo $orders->title;?></td>
                     <td><?php echo $orders->price;?></td>
                     <td><?php echo $orders->quantity;?></td>

</tr>
          <?php  }?>

            </table>

Интересно, как отобразить ордера, которые у меня есть orders.php. потому что foreach $ orders не может быть только из таблицы заказов, верно? Прошу прощения, но да, я окунулся в воспламенитель кода в надежде на быстрое обучение. Опять MVC меня немного смущает.

EDIT Один вопрос: как показать product_order.php для просмотра в браузере? Я изменил код модели - это выглядит правильно?

РЕДАКТИРОВАТЬ II 1) Я хочу ограничить заказы только определенной маркой. Так что мне интересно, целесообразно ли объединять таблицы производителей? Например, идентификатор производителя = имя производителя, а затем отображать заказы проданных продуктов только для определенного бренда.

2) Product_order.php недоступен для просмотра - я имею в виду, что я пытался просмотреть страницу, чтобы увидеть, работает ли она, но ничего не появляется?

3) Хорошо, я отредактировал код в соответствии с Daimsy

    $data[$orders['orders.oid']] = $orders['orders_content.oid'];

Эта строка является ошибкой. Неустранимая ошибка: невозможно использовать объект типа stdClass в качестве массива. Почему нельзя использовать объект?

Ответы [ 3 ]

1 голос
/ 10 июня 2011

Как уже объяснял @Raza Gill, вам нужно присоединиться к таблицам (LEFT JOIN) следующим образом

$this->db->select('*');
$this->db->from('orders');
$this->db->join('orders_content', 'orders.oid = orders_content.oid');
$query = $this->db->get();

В вашей модели вам нужно собрать данные для передачи в представление.,Вы не делаете это правильно, потому что вы делаете assignemnt, который не имеет никакого смысла (вы помещаете туда предложение соединения?)

Это должно быть так:

$data =array();
foreach($q->result_array() as $orders)
{
   $data[] = $orders;
}

return $data;

Следуя шаблону MVC , вы должны теперь извлечь этот массив ($ data) в свой CONTROLLER, который обрабатывает затем переход к правильному представлению.

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

Отредактированный контроллер : Хорошо, основываясь на вашем комментарии, вы хотите вызвать это представление product_order.Вы не можете сделать это напрямую.Представления загружаются (обычно в контроллерах, но не обязательно) в соответствии с URL-адресом, поэтому, если вы хотите, чтобы доступ к странице осуществлялся по адресу index.php/product_order, вам необходимо иметь файл с именем product_order.php в папке контроллеров.Если вы не указываете 2-й сегмент URI (как в вашем случае), вам нужно использовать функцию по умолчанию index().Тогда ваш контроллер будет выглядеть так:

class Product_order extends CI_Controller {

     function index()
     {
        $this->load->model('orders_model'); // (I'm assuming you're not autoloading it. Otherwise, just skip the loading of this model);
        $data['orders'] = $this->orders_model->get();
        $this->load->view('product_order',$data);
     }

}

Если вы в будущем захотите добавить метод, скажем, для просмотра определенного продукта, вы можете сделать `index.php / product_order / view_product / 20Например, у вас будет:

  • product_order: -> контроллер (product_order.php)
  • view_product: -> метод внутри контроллера AND
  • 20: -> идентификатор выбранного вами продукта, который необходимо передать вышеописанному методу.Как function view_product($id) { /....}.Надеюсь, что MVC проясняется для вас.

// Конец редактирования;

Вы можете сейчас, на ваш взгляд 'product_order.php ', соберите массив (в CI индексы массива, предоставленные представлению, преобразуются в одноименную переменную) с foreach, как вы делаете.Но будьте осторожны, вы называете их так, как если бы они были объектами, а вместо этого вы предоставляете ассоциативный массив.ТАК это должно быть так:

 <?php foreach($orders as $order) : ?>
   <tr>
    <td><?php echo $order['product_id']?></td>
    <td><?php echo $order['title'];?></td>
    <td><?php echo $order['price'];?></td>
    <td><?php echo $order['quantity'];?></td>
  </tr>
<?php endforeach; ?>

С вашим кодом все было бы в порядке, если бы вы использовали $ q-> result () вместо $ q-> result_array ()

1 голос
/ 10 июня 2011

Похоже, ваша точка зрения имеет небольшую ошибку: у вас есть:

<?php foreach($orders as $orders){?> <!-- nb. both variables are plural -->

, которая должна быть:

<?php foreach($prders as $order){?> <!-- nb. second variable is singular -->

Аналогично:

<td><?php echo $orders->product_id;?></td>

волятеперь должно быть:

<td><?php echo $order->product_id;?></td>

То, что у вас было раньше, переписывало массив $orders в первый раз в цикле, чтобы он не работал должным образом.

0 голосов
/ 10 июня 2011

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

$this->db->select('*');
$this->db->from('orders');
$this->db->join('orders_content', 'orders.oid = orders_content.oid');
$query = $this->db->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...