2013-11-21 2 views
1

Учитывая таблицу называемые сделки, у меня есть модель, как:Должна ли модель иметь дело с несколькими значениями самой?

class Transaction extends Eloquent { 
    // other methods including some scopes 

    public static function getInteresting() 
    { 
     $data = Transaction::with('location', 'user', 'type') 
     ->category(1) 
     ->salesGroup(3) 
     ->confirmed(); 

     return $data->get(); 
    } 
} 

Итак, допустим, что эти «интересные» операции используются очень часто - я должен возвращаться несколько сделок от модели сделки? Если нет, где должен жить этот код?

+4

[активная запись] (http://martinfowler.com/eaaCatalog/activeRecord.html) экземпляр не «модель» –

ответ

1

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

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

public function scopeInteresting($query) 
{ 
    $query->with('location', 'user', 'type') 
     ->category(1) 
     ->salesGroup(3) 
     ->confirmed(); 
} 

$transactions = Transaction::interesting()->get(); 
1

Я также считаю, что репозитории - это хорошее решение для размещения кода. Они приносят большую гибкость и отделяют модель от контроллера. Я использую их для обеспечения двух реализаций db для моих контроллеров - mongo и mysql. Вы можете создать свой собственный уровень сервиса, но ваш код связан с db, поэтому хранилищами являются опции для перехода.

+0

Почему ваши контроллеры заботятся о том, какое хранилище используется глубоко под ним? Или даже если есть постоянное хранилище ** вообще ** ... –

1

Здесь, где я работаю, мы используем три слоя для решения этой проблемы.

Entity представляет (очевидно) объект, такой как транзакция. Он содержит поля и сеттеры e getters для этих полей.

DAO предоставляет методы доступа к базе данных, относящиеся к конкретному объекту.

BO предлагает методы, которые выполняют бизнес-логику наших приложений.

Итак, в вашем случае: DAO\Transaction выполнит запрос и вернет несколько экземпляров Entity\Transaction.

Надеюсь, это поможет.

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