2013-07-31 3 views
2

Я хочу посчитать количество сообщений, принадлежащих тегу. Должен ли я использовать метод или динамическое свойство?«Метод» против «Динамического свойства» в «Красноречивой ORM» с Laravel?

<?php 

class Tag extends Eloquent { 

    public function posts() 
    { 
     return $this->belongsToMany('Post'); 
    } 

    public function postsCount() 
    { 
     return count($this->posts); 
    } 

    public function getPostsCountAttribute() 
    { 
     return count($this->posts); 
    } 

} 

Таким образом, в шаблоне я должен использовать динамическое свойство:

{{ $tag->postCount }} 

или метод:

{{ $tag->postCount() }} 
+0

Если вы хотите получить чистый счетчик SQL, вы должны использовать этот метод вместо динамического свойства (accessor). У вас будет что-то вроде: '$ tag-> posts() -> count()'. –

ответ

6

Выдержка из документации Laravel 4 относительно красноречив в Dynamic Properties (аксессору) в отношениях (полужирный являются моими):

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

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

Если выдать количество сообщений с использованием метода следующим образом:

$count = $tag->posts()->count(); 

Это будет генерировать правильный SQL с агрегатной функцией COUNT.

В другой стороны, если вы выдать количество сообщений с помощью динамического свойства (аксессор) следующим образом:

$count = count($tag->posts); 

Это будет получать все сообщения, преобразовать их в массив объектов, а затем подсчет числа элементов массива.

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

+0

Я хочу просто посчитать их (и показать номер в пакетном режиме), поэтому, если я не знаю, я использую '{{$ tag-> posts() -> count()}}' напрямую? – Shaddow

+0

Я считаю, что это было бы более эффективно. –

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