Как сохранить слабосвязанные модели при запросе таблицы «многие ко многим» в CodeIgniter?

Я использую CodeIgniter и имею три таблицы и модель для каждой:

  • Пользователь - таблица пользователей
  • Продукт - таблица продуктов
  • UserProduct — таблица, показывающая, какие продукты есть у пользователей (два столбца внешнего ключа и некоторые другие столбцы, такие как дата)

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

Это прекрасно работает, но теперь меня беспокоит то, что я иду по пути жесткой связи. Например, скажем, я хочу узнать URL-адрес изображения продукта. У меня есть метод в модели продукта, чтобы вернуть это, я не хочу дублировать метод в модели UserProduct, и я не хочу создавать связь, когда модель UserProduct пытается получить доступ к методам в других моделях (которые я не думайте, что CodeIgniter нравится вам).

Эта проблема, вероятно, возникает в любой модели, которая обращается к таблице БД с внешними ключами, где этой модели могут потребоваться данные из родительской таблицы и она хочет манипулировать ими.

Есть ли элегантное решение, или мне нужно признать, что внешние ключи обязательно создают связи в моделях или потребность в аналогичных методах в моделях?

ТИА, Фил.


person Philip Wattis    schedule 04.04.2013    source источник


Ответы (1)


Мой личный стандарт — всегда создавать 1 контроллер + 1 модель.

например site.com/users будет использовать model_users.php или site.com/products будет использовать model_products.php

чтобы уменьшить код и повторно использовать методы, используйте параметры методов, например, метод модели, который будет повторно использоваться, может быть:

function getUsers($data){
 foreach($data as $key=>$value){
  $this->db->where($key,$value);
}
$query = $this->db->get('users');
return $query->result();
}

чем больше вы расширяете этот метод, тем больше вы можете использовать повторно, просто еще один пример расширения:

 function getUsers($data,$order_by = false){
     foreach($data as $key=>$value){
      $this->db->where($key,$value);
    }
 if($order_by){
  foreach($order_by as $key=>$value){
  $this->db->order_by($key,$value);
  }
  }
    $query = $this->db->get('users');
    return $query->result();
    }

//then you call results with this in your controller
   $results =  $this->model->getUsers(
      $data = array('id'=>'12','country'=>'USA'),
       $order_by = array('username'=>'DESC')
     );

так что теперь у вас также есть order_by и т. д., вы можете добавить joins, limit,offset,like и т. д.. все таким же или совершенно таким же образом, чем точнее вы, тем больше вы можете повторно использовать одни и те же методы.

person itsme    schedule 04.04.2013
comment
Спасибо, ок. Я не уверен, что мне нравится это решение, поскольку оно привело бы к росту базовой модели с методами бизнес-логики для всех видов разрозненных функций. Конечно, специфичные для таблиц методы должны быть в соответствующих моделях, а не появляться в базовой модели, которая расширяется всеми другими моделями? - person Philip Wattis; 04.04.2013
comment
@PhilipWattis уверен, что таблица -› модель;) если вам нужно присоединиться, используйте 1 модель, а не вложенные методы - person itsme; 04.04.2013