2013-02-21 1 views
0

Я строил проект электронной документации по клинике/пациенту, основанный на кодеджигнере, и я решил отправиться в орм, так как у меня много отношений между моим бб.datamapper orm для codeigniter. о времени загрузки и отношениях

поэтому я загрузил datamapper 1.8.2 и начал новый проект codeigniter, первое, что я заметил, было время загрузки!

страница приветствия codeigniter теперь загружается в 1seC++! без какой-либо логики! это нормально ? и приемлемо ли это? обычно ci загружается на 0,002 секунды на моей машине, но с datamapper orm его 1,06 в лучшем виде!

вопрос о взаимоотношениях.

У меня есть 2 таблицы, например

таблицы 1 пользователей. я использую, чтобы хранить все свои офисные госзакупки, и роль

примера (пользователи)

|ID|name|role | 
|1 |Demo|admin | 
|2 |Demo|doctor | 
|3 |Demo|nurse | 
|4 |Demo|patient| 

второй таблица это посещение

|id|doctor_id|patient_id|..... 
|1 |2  |4   |...... 

так, как я могу настроить это так, чтобы DataMapper поняли бы, что каждый пользователь в пользователях играет роль, и эта таблица посещает has_one(doctors,patient) и пользователей (врачей, пациентов) has_many(visits)? , поскольку каждый визит должен иметь только одного врача и пациента, но у каждого пациента/врача может быть много посещений.

тока установки пробных

class Visit extends DataMapper { 
    var $has_one = array(
     'doctor' => array(
      'class' => 'user', 
      'join_self_as' => 'doctor_id', 
      'other_field' => 'visit' 
     ), 
     'patient' => array(
      'class' => 'user', 
      'join_self_as' => 'patient_id', 
      'other_field' => 'visit' 
     ) 
    ); 
    var $has_many = array(); 

Пользователи

class User extends DataMapper { 
    var $has_one = array(); 
    var $has_many = array(
     'visit' => array(
      'class' => 'visit', 
      'other_field' => 'doctor_id', 
      'join_self_as' => 'doctor_id', 
     ) 
    ); 

, но когда я пытаюсь получить доступ к врачу визита

$u=new user(2); 
$u->visit->get(); 

это дает мне ошибку

DataMapper Error: 'doctor_id' is not a valid parent relationship for Visit. Are your relationships configured correctly? 

help?!

+0

Что касается медленного времени загрузки: да, ORM замедлит вашу систему. Он предназначен для того, чтобы сделать вашу работу в качестве разработчика намного проще в работе со сложными базами данных. Вы жертвуете временем загрузки для более быстрого развития. Если это невыносимо, рассмотрите возможность использования Active Record или обновления вашей системы. –

ответ

1

С ORM или без него вы, как разработчик, всегда должны знать об используемых вами инструментах и ​​в этом случае код, который вы пишете, чтобы создавать запросы, запущенные в вашей БД. По мере того, как запросы идут, Datamapper более эффективен, чем большинство, используя объединения, а не многочисленные запросы, где это возможно.

Чтобы узнать, какие запросы генерируются Datamapper, включите профилировщик CI. Вы быстро увидите, эффективен ли ваш код, или если вы запускаете больше запросов, то вам нужно.

Вы включили кеш производства? Если нет, Datamapper будет запускать DESCRIBE TABLE для каждой загружаемой модели, каждый запрос страницы. Хотя это нормально в разработке (когда ваши структуры таблиц все еще меняются), это не очень хорошая идея в производстве, и, вероятно, это займет большую часть времени.

+0

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

+0

, но также им, имея очень трудное время, выясняя внутренние отношения с datamapper, можете ли вы ответить на эту проблему отношения, упомянутую в моем вопросе? – Zalaboza

0

Ты отношения не определены должным образом:

class Visit extends DataMapper { 
    var $has_one = array(
     'doctor' => array(
      'class' => 'user', 
      'join_self_as' => 'doctor', 
     ), 
     'patient' => array(
      'class' => 'user', 
      'join_self_as' => 'patient', 
     ) 
    ); 


class User extends DataMapper { 
    var $has_many = array(
     'visit' => array(
      'join_other_as' => 'doctor', 
     ) 
    ); 

Вы только переопределить значения не по умолчанию, DataMapper заполнит все остальное.Кроме того, не используйте суффикс «_id», это обязательно, и Datamapper добавит его автоматически.

Для посещения вам необходимо указать, какой FK используется в отношении представления его собственного «id», который будет «doctor_id» для отношения «доктор» и «patient_id» для отношения «пациент».

Для пользователя, вы должны сказать, что FK в другой таблице не является «visit_id» (который был бы по умолчанию), но «doctor_id».