Snippets

Michael Riddle Query To Conditions formatter for CakePHP3

Created by Michael Riddle last modified
<?php
namespace App\Utility;

use Cake\I18n\Time;
use Cake\ORM\TableRegistry;
use Cake\Utility\Inflector;

function queryToConditions($model, $query)
{
    $modelAlias = $model->alias();

    $conditions = [];
    foreach($query as $queryKey => $queryValue)
    {
        if(!empty($queryValue))
        {
            try {
                $columnSchema = $model->schema()->column($queryKey);
                if($columnSchema)
                {
                    if($columnSchema['type'] == 'string')
                    {
                        $conditions[$modelAlias . '.' . $queryKey . ' LIKE'] = $queryValue . '%';
                    }
                    elseif($columnSchema['type'] == 'datetime')
                    {
                        $timeObject = new Time($queryValue);
                        $conditions[$modelAlias . '.' . $queryKey] = $timeObject->i18nFormat(I18N_SQL_DATETIME);
                    }
                    elseif($columnSchema['type'] == 'datetime')
                    {
                        $timeObject = new Time($queryValue);
                        $conditions[$modelAlias . '.' . $queryKey] = $timeObject->i18nFormat(I18N_SQL_DATETIME);
                    }
                    elseif($columnSchema['type'] == 'json')
                    {
                        $conditions[$modelAlias . '.' . $queryKey . ' LIKE'] = $queryValue . '%';
                    }
                    else
                    {
                        $conditions[$modelAlias . '.' . $queryKey] = $queryValue;
                    }
                }
            }
            catch(\Exception $e)
            {
                // Do nothing...
            }
        }
    }

    foreach($model->associations() as $association)
    {
        if(is_a($association, 'Cake\ORM\Association\BelongsTo') || is_a($association, 'Cake\ORM\Association\HasOne'))
        {
            $associationName = Inflector::singularize($association->name());
            if(!empty($query[$associationName]))
            {
                $associationTable = TableRegistry::get($association->name());
                $conditions += queryToConditions($associationTable, $query[$associationName]);
            }
        }
    }
    return $conditions;
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.