Метод Laravel, связывающий запрос через функцию

Можно ли условно связывать методы в PHP/Laravel или передавать цепочки методов через функции?

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

$query = Model::whereFoo('bar');

if ($needFoo) {
    $query = $query->has('foo');
}

$query = queryMethod($query);

function queryMethod($query) {
    return $query->where('something', '<', 10);
}

$items = $query->get();

Это, кажется, игнорирует все между $query = Model::whereFoo('bar'); и $items = $query->get(); - кажется, не имеет никакого значения, что происходит с $query между ними.

Возможно/целесообразнее ли этого добиться?

Изменить: я принял приведенный ниже ответ, поскольку он отвечает на заданный мной вопрос. Моя проблема была на самом деле не связана. Если это кому-нибудь поможет: у меня был мошеннический вызов orWhere() в базовом запросе, который, конечно, включал нежелательные результаты независимо от других связанных методов. Это требовало вложения внутри расширенного метода where, , как описано в документации Laravel.


person glasstree    schedule 25.07.2014    source источник
comment
Должна быть возможность просто вернуть $query; просто воздействуйте на объект, в приведенном выше примере вы возвращаете результат метода where(), который может работать, потому что он должен быть $this, но в любом случае вы можете передать объект $query вокруг всего, что хотите, это своего рода точка построителя запросов. Вы также должны иметь возможность клонировать его и вносить изменения в отдельную копию, так что для общего количества с той же логикой, где вы можете изменить выбор, чтобы сделать подсчет и удалить ограничения и т. д.   -  person ArtisticPhoenix    schedule 25.07.2014
comment
@ArtisiticPhoenix - $query - это объект, который передается по ссылке, поэтому даже не должно быть необходимости возвращаться из этой функции. Код выше должен работать. И весь этот $query = $query тоже лишний.   -  person Joseph Silber    schedule 25.07.2014
comment
Думаю, я понял. Это не было проблемой при цепочке методов или передаче объекта $query. Я думаю, что проблема была в последовательности методов. У меня был вызов with() в базовом запросе, который, похоже, помешал более поздним методам where() вступить в силу. Это звучит правильно?   -  person glasstree    schedule 25.07.2014
comment
@Joseph Silber, хорошо, что я должен был видеть, что делаю то же самое с построителем запросов Doctrine ... лол   -  person ArtisticPhoenix    schedule 25.07.2014
comment
@glasstree - Нет. with не должно мешать пунктам where.   -  person Joseph Silber    schedule 25.07.2014
comment
Итак, я прав, думая, что любая последовательность методов хороша, если в ней нет get(), paginate() и т. д. до конца?   -  person glasstree    schedule 25.07.2014
comment
@glasstree - Да. Конечно. Пока вы все еще работаете с объектом запроса, вы должны иметь возможность добавлять все, что захотите.   -  person Joseph Silber    schedule 25.07.2014


Ответы (1)


То, что у вас есть, должно работать, но вы можете упростить его:

$query = Model::whereFoo('bar');

if ($needFoo) $query->has('foo');

queryMethod($query);

function queryMethod($query) {
    $query->where('something', '<', 10);
}

$items = $query->get();

Поскольку объекты в PHP передаются по ссылке, вы всегда будете иметь дело с одним и тем же экземпляром.

person Joseph Silber    schedule 25.07.2014