как получить предложение where в строковом формате, используя CakePHP3 ORM?

В CakePHP3 есть ORM, который помогает в построении запросов.

От документация, я могу увидеть это

$query = $articles->find(); // build a query that has not run yet
$query->where(['id' => 1]); // Return the same query object

Так что в этом случае я хочу строку

WHERE `articles`.`id` = 1

После долгих поисков я обнаружил, что есть способ вернуть только предложение where объекта запроса.

$query->where(['id' => 1])->clause('where'); // Return the where clause in the form of a QueryExpression

Больше гуглинг заставляет меня узнать, как получить выражение QueryExpression, чтобы выплюнуть строковое представление

$query->where(['id' => 1])->clause('where')->sql($valueBinder); // Return the where clause in string format

Здесь моя проблема. Я не знаю, как должен выглядеть $ valueBinder. Я не знаю, как его инициализировать.

Я также счастлив не использовать ValueBinder, пока я могу получить предложение where в строковом формате, используя CakePHP 3 ORM и на правильном диалекте SQL. Пожалуйста, предположите, что я использую MySQL.

Пожалуйста, порекомендуйте.

РЕДАКТИРОВАТЬ

Я пытался использовать $query->valueBinder() как $valueBinder,

Он пуст и не содержит связанных c:0 к стоимости 1,

1

Решение

Чтобы напрямую ответить на ваш вопрос, вы можете получить SQL для любого предложения следующим образом:

$binder = new \Cake\ORM\ValueBinder();
$query->clause('where')->sql($binder);

Это вернет SQL с правильными заполнителями, а не со значениями, которые будут использоваться. Ценности живут в $binder переменные и используются для объектов выписки.

Как я вижу, вы хотели только сохранить внутреннюю структуру where условие, чтобы передать его другому запросу в другом запросе. Ваше решение в порядке, но я хотел бы добавить, что вы также можете закодировать полное дерево условий из существующего запроса:

$where = serialize($query->clause('where'));
$anotherQuery->where(unserialize($where)); // A query in another request

В любом случае вам нужно быть осторожным с тем, что вы не сериализуете, поскольку взятие этого непосредственно из пользовательского ввода, безусловно, приведет к проблемам с безопасностью.

2

Другие решения

Вы можете пропустить этот параметр, если хотите. Посмотри пожалуйста http://api.cakephp.org/3.0/class-Cake.Database.Query.html#_sql

Кроме того, вы можете использовать функцию-член Query traverse ($ visitor, $ parts), чтобы изолировать предложение where. $ visitor — это функция, которая принимает значение и предложение. Вы определяете поведение $ посетителя. $ parts — это массив имен предложений. Я предлагаю передать массив (‘где’) в этот параметр.

0

Мой обходной путь — я сохраняю условия в формате строки json.

Используя тот же пример, я делаю

$data['conditions'] = json_encode(['Articles.id' => 1]); // encode into JSON string
$this->DynamicRules->patchEntity($dynamicRule, $data); // use in edit action of DynamicRulesController

тогда, когда мне нужно повторно использовать условия, я делаю:

$articlesTable = TableRegistry::get('Articles');
$query = $articlesTable->find(); // new query for Articles

$rule = json_decode($dynamicRule->conditions, true); // get back the conditions in associative array format
$query->where($rule); // re-assign the conditions back

Это дало мне то, что я в конечном итоге хотел.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector