Итак, после просмотра последней версии 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))
Это некоторые ОЧЕНЬ длинные ответы на простой вопрос.
Короткий ответ: Теперь это полностью поддерживается. Перегружайте, если вам это нравится!
Это возможно, но не идеально и считается плохим и больше для «быстрого исправления», чем идеальная или чистая реализация.
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, подобный этому, вероятно, плохой идея. Попытайтесь переосмыслить свой макет и просто передать данные в / из вашего контроллера в модели.
Я думаю, что в целом лучше использовать библиотеки записи, которые обращаются к моделям, а затем, при необходимости, включать библиотеки в вашу модель.
Например, если вам нужно проверить, авторизован ли кто-то для выполнения определенного действия CRUD, вы можете захотеть включить любую используемую вами библиотеку аутентификации (в большинстве случаев она, вероятно, включается автоматически). Вы не обязательно захотите обращаться к модели напрямую - это просто кажется грязным и неподходящим.
Я думаю, что предпочтительный способ - сделать то, что вам нужно, в вашем контроллере и передать результаты одного метода (ов) модели , если необходимо, к методам другой вашей модели.
Несмотря на это, я не понимаю, почему невозможно включить одну модель в другую как таковую. Однако я не думаю, что вы можете сделать это с помощью синтаксиса, который вы показываете. Придется сделать это каким-нибудь другим запутанным способом. В любом случае, IMO, это плохая практика включать модель непосредственно в другую модель.
Я категорически не согласен с тем, что «модель» должна инкапсулировать таблицу базы данных только с простыми операциями 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;
}
В подобных ситуациях в 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);
Я думаю, что это более чистые возможности.
Какой способ использовать, зависит от того, сколько методов нуждаются в доступе к другой модели. Если их один или два, то, возможно, лучше передать ее как параметр метода. Если больше - я думаю, лучше иметь атрибут класса и сеттер.
И элегантным способом вы можете дать одну модель или другую в зависимости от некоторого условия - если они обе частично реализуют один и тот же интерфейс с одним и тем же типом возвращаемых данных (это редко полезно, но иногда может быть).