<?
/**
* Handles dynamic "where" clauses to the query.
*
* @param string $method
* @param string $parameters
* @return $this
*/
public function dynamicWhere($method, $parameters)
{
// Убираем слово `where` из названия нашего метода
$finder = substr($method, 5);
// Разбиваем название метода на сегменты по заданному регулярному выражению, и возвращаем строку сегментов метода.
// Например `nameAndId` преобразуется в массив ['Name', 'And', 'Id']
$segments = preg_split('/(And|Or)(?=[A-Z])/', $finder, -1, PREG_SPLIT_DELIM_CAPTURE);
// Оператор по умолчанию у нас `and`. То есть, например, если у нас цепочка методов `whereName()->whereId()`, то между ними по умолчанию стоит `and`.
// Этот оператор служит для связи с предыдущей частью запроса
$connector = 'and';
$index = 0;
foreach ($segments as $segment) {
// Проходя по всем нашим сегментам мы проверяем, если сегмент не `And` и не `Or`, то добавляем наш динамический where.
// В методе `addDynamic` можно увидеть по сути одну строку(помимо преобразования оператора в lowercase): `$this->where(Str::snake($segment), '=', $parameters[$index], $bool);`.
// Именно в нём наш динамический метод превращается в обычный `where` с параметрами
if ($segment != 'And' && $segment != 'Or') {
$this->addDynamic($segment, $connector, $parameters, $index);
$index++;
}
// Иначе мы меняем наш оператор связи с предыдущей частью запроса, в случае если у нас более сложное название метода, например `whereNameAndId` или `whereNameAndIdOrColor`
else {
$connector = $segment;
}
}
return $this;
}