Доступ к моделям CodeIgniter в других моделях

Итак, после просмотра последней версии purrr 0.3.0 (была в более старой версии) map_depth указала в правильном направлении.

a %>% select(count)%>% map_depth(.depth=2,.f=myfuncMultipleRow) %>%  map_dfr(.f=bind_rows)

Отбрасывание map_depth (), bind_rows () и вложение вместо этого:

a %>% select(count)%>% map_dfr(~map_dfr(.,myfuncMultipleRow))
a %>% select(count)%>% map_dfr(.f=function(x) map_dfr(x,.f=myfuncMultipleRow))
38
задан imlouisrussell 1 January 2012 в 02:00
поделиться

5 ответов

Это некоторые ОЧЕНЬ длинные ответы на простой вопрос.

Короткий ответ: Теперь это полностью поддерживается. Перегружайте, если вам это нравится!

69
ответ дан 27 November 2019 в 03:05
поделиться

Это возможно, но не идеально и считается плохим и больше для «быстрого исправления», чем идеальная или чистая реализация.

class Location extends Model{
      public function get($ID){
                // Get main CI object handle and load model
                $CI =& get_instance();
                $CI->load->model('LocationType');
                // Call new model functions using handle to main CI object
                $CI->LocationType->setID($result->LocationTypeID);
                $CI->LocationType->setTitle($result->TypeTitle);
                $this->_locationType = $CI->LocationType;
                //Other Stuff
    }
}

Каждый раз, когда вы используете основной объект CI, подобный этому, вероятно, плохой идея. Попытайтесь переосмыслить свой макет и просто передать данные в / из вашего контроллера в модели.

http://codeigniter.com/forums/viewthread/69833/

8
ответ дан 27 November 2019 в 03:05
поделиться

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

Например, если вам нужно проверить, авторизован ли кто-то для выполнения определенного действия CRUD, вы можете захотеть включить любую используемую вами библиотеку аутентификации (в большинстве случаев она, вероятно, включается автоматически). Вы не обязательно захотите обращаться к модели напрямую - это просто кажется грязным и неподходящим.

Я думаю, что предпочтительный способ - сделать то, что вам нужно, в вашем контроллере и передать результаты одного метода (ов) модели , если необходимо, к методам другой вашей модели.

Несмотря на это, я не понимаю, почему невозможно включить одну модель в другую как таковую. Однако я не думаю, что вы можете сделать это с помощью синтаксиса, который вы показываете. Придется сделать это каким-нибудь другим запутанным способом. В любом случае, IMO, это плохая практика включать модель непосредственно в другую модель.

0
ответ дан 27 November 2019 в 03:05
поделиться

Я категорически не согласен с тем, что «модель» должна инкапсулировать таблицу базы данных только с простыми операциями CRUD. Как отмечено в статье Википедии:

http://en.wikipedia.org/wiki/Model-view-controller#As_a_design_pattern

... этот уровень приложения предназначен не только для работы в качестве единой базы данных. таблица абстракции. Подумайте о значении слова «контроллер» - он должен действовать скорее как директор, а не как все приложение само по себе. «Модель» - это место для бизнес-логики. Большинство крупномасштабных приложений фактически содержат большую часть своей бизнес-логики в самой базе данных (в форме триггеров, хранимых процедур, внешних ключей и т. Д.).

Я думаю, неправильное понимание того, что такое «модель» Это частично вызвано той же (чрезмерной) шумихой вокруг "MVC", не связанной с пониманием самих концепций. Вроде как пуст «AJAX» или, что еще проще, «Web 2.0». К лучшему или худшему, но многие «детишки сценариев» запрыгнули на повозку MVC, и, поскольку простые практические инструкции и примеры сценариев не делают ничего больше, чем просто говорят вам поместить код базы данных в «модель», неправильное использование этого уровня как только абстракция базы данных стала обычным явлением. Теперь вы читаете в Интернете сообщения, в которых говорится о «нечистом», «грязном», «хакерском» воплощении любой бизнес-логики в модели. Это неверно. Ложная информация.

Простой пример - подумать о внешних ключах: даже если вы хотите, чтобы ваша «модель» была только моделью базы данных , если вы хотите быть «

Я взял приведенный выше пример кода и преобразовал его в помощника, так что теперь у меня есть функция, которая работает почти так же, как обычные функции $ this-> load-> model (). Вот он (поместите его в помощник, который загружается автоматически, и вы можете использовать его в любой модели):


   /**
    *
    * Allow models to use other models
    *
    * This is a substitute for the inability to load models
    * inside of other models in CodeIgniter.  Call it like
    * this:
    *
    * $salaries = model_load_model('salary');
    * ...
    * $salary = $salaries->get_salary($employee_id);
    *
    * @param string $model_name The name of the model that is to be loaded
    *
    * @return object The requested model object
    *
    */
   function model_load_model($model_name)
   {
      $CI =& get_instance();
      $CI->load->model($model_name);
      return $CI->$model_name;
   }
39
ответ дан 27 November 2019 в 03:05
поделиться

В подобных ситуациях в Code Igniter я предпочитаю одну из двух возможностей:

1) Иметь атрибут и сеттер модели следующим образом:

class X extends Model {
  var $Y_model;
  public function setY($Y) {
    $this->Y_model = $Y;
  }

  public function doItRightNow($a,$b) {
    $list = $this->Y_model->getSomeList($a,$b);
    // ...
  }
  // ...
}


И затем использовать этот сеттер перед другими методами, чтобы дать экземпляр другой модели, чтобы он мог быть использован методами.

$this->load->model('X');
$this->load->model('Y');
$this->X->setY($this->Y);
$this->X->doItRightNow($something,$somethingElse);



2) Иметь параметр в методе, по которому я буду передавать экземпляр другой модели из контроллера.

class X extends Model {
  public function doItRightNow($a,$b,$Y_model) {
    $list = $Y_model->getSomeList($a,$b);
    // ...
  }
  // ...
}

И использовать его вот так:

  $this->load->model('X');
  $this->load->model('Y');
  $this->X->doItRightNow($something,$somethingElse,$this->Y);



Я думаю, что это более чистые возможности.
Какой способ использовать, зависит от того, сколько методов нуждаются в доступе к другой модели. Если их один или два, то, возможно, лучше передать ее как параметр метода. Если больше - я думаю, лучше иметь атрибут класса и сеттер.
И элегантным способом вы можете дать одну модель или другую в зависимости от некоторого условия - если они обе частично реализуют один и тот же интерфейс с одним и тем же типом возвращаемых данных (это редко полезно, но иногда может быть).

1
ответ дан 27 November 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: