65 lines
1.8 KiB
PHP
65 lines
1.8 KiB
PHP
<?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;
|
|
|
|
// ---------------------------------------------------------
|
|
// Iterate through each segment and add the conditions.
|
|
// ---------------------------------------------------------
|
|
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;
|
|
}
|
|
|
|
} |