noganno
1/4/2018 - 8:48 AM

динамические where

<?
/**
 * 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;
}