2015-12-01 2 views
1

Что разница между использованием в красноречивойкрасноречив с помощью scopeSomeName() против SomeName()

class SomeModel extends Model{ 
    public function active(){ 
     return $this->where('active','=',1); 
    } 
} 

против:

class SomeModel extends Model{ 
    public function scopeActive($query){ 
     return $query->where('active','=',1); 
    } 
} 

я могу использовать их как так же, как и я получаю тот же результат ...

$SomeModel->active()->get(); 

Есть ли какое-либо преимущество в отношении «возможности»?

редактировать: Я имею в виду это из документации http://laravel.com/docs/5.1/eloquent#query-scopes

Прицелы позволяют определить общие наборы ограничений, которые вы можете легко повторно использовать в вашем приложении. Например, вам может понадобиться , чтобы часто получать всех пользователей, которые считаются «популярными». Для определите область действия, просто префикс метода модели Eloquent с областью видимости.

но, как я уже сказал, я могу сделать то же самое без префикса с «областью», так зачем вообще беспокоиться?

+0

Возможно, это улучшает читаемость вашего кода, заявляя, что функция является областью ... – Amarnasan

+0

Использование области дает вам доступ к объекту Builder. Это позволяет вам контролировать такие вещи, как привязки и методы доступа, которые недоступны с помощью '$ this' на самой модели –

ответ

3

Вы можете получить доступ к области действия запроса при вызове статического

Model::action()->get(); 

вы не можете сделать это с помощью общего метода. Для меня, как сказал Арманасан, это даст мне читаемость моего кода.

0

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

Как пояснил @Benyamin Maengkom, этот метод также может использоваться статически.

+1

спасибо, я думаю, что Беньямин Маенком прав. Я также могу использовать методы таким же образом без сферы –

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