<?php namespace System\DB\Query; use System\Str; class Dynamic { /** * Add conditions to a query from a dynamic method call. * * @param string $method * @param array $parameters * @param Query $query * @return Query */ public static function build($method, $parameters, $query) { // Strip the "where_" off of the method. $finder = substr($method, 6); // Split the column names from the connectors. $segments = preg_split('/(_and_|_or_)/i', $finder, -1, PREG_SPLIT_DELIM_CAPTURE); // The connector variable will determine which connector will be used for the condition. // We'll change it as we come across new connectors in the dynamic method string. // // The index variable helps us get the correct parameter value for the where condition. // We increment it each time we add a condition. $connector = 'AND'; $index = 0; foreach ($segments as $segment) { if ($segment != '_and_' and $segment != '_or_') { if ( ! array_key_exists($index, $parameters)) { throw new \Exception("Wrong number of parameters for dynamic finder [$method]."); } $query->where($segment, '=', $parameters[$index], $connector); $index++; } else { $connector = trim(strtoupper($segment), '_'); } } return $query; } }