2014-11-21 2 views
1

ERD example http://i57.tinypic.com/zn367d.pngмодель Phalcon и атрибут таблицы с несколькими внешними ключами

Как вы можете видеть из этого ERD, я проектирования регистратор, что следить за действиями нескольких типов пользователей. Например, каждая запись в таблице logger.log будет иметь только одну связанную запись в одной из связанных журналов logger.relate. *.

Использование Phalcon модели как АВТОНОМНЫЙ, у меня есть 7 моделей, один для основной таблицы и 6 для таблиц отношений:

  • Вход
  • LogRelateCarrier
  • ...

В классе модели журнала я использовал метод hasMany() для установки отношения 1-n; в других классах моделей я использовал метод belongsTo() для отношений n-1.

Мой вопрос: есть способ в Phalcon непосредственно обрабатывать сценарии как этот, так что я смог бы получить как ID записи журнала актера просто делать что-то вроде:

$log  = Log::findFirst(1); 
$id_actor = $log->getIdActor(); // Getter method for actor's ID 
$actor_type = $log->getActorType(); // Getter method for actor's type (customer, carrier, etc.) 

имеющий методы получения очень простые, что-то вроде (извините, я действительно новичок в этих рамках):

public function getIdActor() { 
    return $this->id_actor; 
} 

другими словами, я хотел бы знать, если есть способ в этом контексте для обработки такого сценария без вынуждены записывать себе другие подпрограммы. И, когда это возможно, с некоторой производительностью (поскольку я держу тип актера в классе logger.log, чтобы узнать, какую реляционную таблицу мне придется запрашивать, вместо того, чтобы запрашивать все реляционные таблицы, а затем вычислять только одну запись из единственная таблица, которая ее удерживает).

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

Надеюсь, что я объяснил ситуацию, большое вам спасибо!

ответ

0

EIDT: После того, как наконец-то поняли, что означает, ответ отрицательный. Вы должны использовать запросы или придерживаться своей фактической реализации. Я не думаю, что накладные расходы были бы слишком много с вашей реальной реализацией.

ОРИГИНАЛ: Я не совсем уверен, что правильно понял ваш вопрос.

Вы хотите выбрать родственную модель изнутри вашей модели? Если это так, вы можете использовать applyTo и hasMany для создания псевдонима. Последний параметр обоих методов является массив:

array(
    'alias' => 'yourAlias' 
) 

Теперь вы можете использовать $log->yourAlias->getIdActor();

+0

Я знал о связанных моделей. Моя «проблема» заключается в том, что каждый экземпляр основной модели будет иметь только один экземпляр одной из шести связанных моделей, основанный на условии, что таблица относительных отношений имеет или не имеет записи, связанной с записью основной таблицы. Вследствие этого я обработал ситуацию с помощью findFirst правильной связанной модели по атрибуту экземпляра главной модели «type_actor», избегая запуска других 5 findFirst в других связанных таблицах, которые из-за предварительных условий будут производить пустые результирующие объекты. Есть ли у Phalcon особый способ автоматически справиться с такой ситуацией. – user3418803

+0

Все еще не уверен, что я правильно понял .. Давайте продолжаем пытаться :) Вы можете создать метод в лог-модели, который реализует переключатель actor_type и возвращает затем соответствующую модель, связанную через отношение. Надеюсь, что это поможет :) – Celoain

+0

По вашему ответу вы получили сценарий. То, что вы объяснили, является фактическим решением, которое я реализовал. Он фактически выполняет два отдельных запроса: один для модели Log и другой для соответствующей связанной модели. Я мог бы получить одну и ту же дату с одним внешним запросом на соединение, но хотел бы знать, мог ли я сделать Phalcon такую ​​операцию, оставаясь на таком концептуальном высоком уровне :) – user3418803

Смежные вопросы