Моего вопроса основан на Data Viewer with Laravel 5.3 and Vue.jsКак и почему этот код работает?
Этот чувак создает признак DataViewer и коды это похоже на следующее:
trait DataViewer
{
// $query should be a Query Builder
public function scopePaginateAndOrder($query)
{
// Validation ...
// Where, Pagination, Order etc ...
return $query->where('foo', 'like', 'bar');
}
}
Теперь вы можете использовать эту особенность в любых красноречивых моделях, чтобы добавить функцию поиска.
class Customer extends Model
{
use DataViewer;
}
Все обычные вещи, ничего особенного ... но есть некоторые «магия» я did't увидеть в PHP еще.
В контроллере он делает что-то вроде
$model = App\Customer::paginateAndOrder();
Последний фрагмент кода имеет много аспектов я не могу понять.
- Почему я называю это нестатическим-методом в статическом-методе, как с помощью ::?
- Почему я могу опустить сфера действия от имени метода?
- Мне не нужно передавать объект Query Builder в качестве параметра. Итак, как черта «знает», на какой модели я хочу разбивать/упорядочивать
Спасибо за помощь!
«Мне не нужно передавать объект Query Builder в качестве параметра', а' // $ query должен быть построителем запросов »- это плохая практика (should/can/...). Почему функция не выглядит так: 'public function scopePaginateAndOrder (QueryBuilder $ query = null)'? На '1.' он выдает примечание/предупреждение в php' Строгие стандарты: нестатический метод ', но вызов будет вызван. Что значит «2.»? – JustOnUnderMillions
И кстати: как только вы поговорите о 'scopePaginateAndOrder', то о' paginateAndOrder', будет 2 diff. метод называется не то же самое. поэтому вы не можете опустить «область» при попытке вызвать «scopePaginateAndOrder()». В вашей логике происходит что-то другое. – JustOnUnderMillions
Хорошо, но не тип, намекающий на параметр, действительно является плохой практикой, я просто сделал копию и вставку из вышеупомянутого связанного видео. И да, мне нужно использовать paginateAndOrder() INSTEAD of scopePaginateAndOrder(), иначе это вызовет исключение – Qobus