CakePHP ИЛИ условие не работает должным образом - PullRequest
0 голосов
/ 26 апреля 2019

У меня следующая проблема: у меня есть таблица для клиентов, с предварительным именем и именем. Теперь у меня есть переменные ключевые слова (в этом примере жестко закодированные 2) в массиве, и я хочу проверить, совпадает ли одно из ключевых слов с именем ИЛИ с предварительным именем. Поэтому я решил использовать условие ИЛИ в следующем codenippet. К сожалению, он не обеспечивает желаемый результат:

$searchValueArr = ["keyword1","keyword2"];
$customers = $customersTable->find()
->where(function (QueryExpression $exp) {
    $orConditions = $exp->or_(function ($or) {
        foreach($searchValueArr as $searchValue) {
            $or = $or
            ->eq('prename LIKE', "%".$searchValue."%")
            ->eq('name LIKE', "%".$searchValue."%");
        }
        return $or;
    });
    return $orConditions;
})
->all();

1 Ответ

2 голосов
/ 26 апреля 2019

Вам нужно перечислить $searchValueArr в части use каждой анонимной функции, иначе это не в контексте, например:

$searchValueArr = ["keyword1","keyword2"];
$customers = $customersTable->find()
    ->where(function (QueryExpression $exp) use ($searchValueArr){
        $orConditions = $exp->or_(function ($or) use ($searchValueArr){
            foreach($searchValueArr as $searchValue) {
                $or = $or
                    ->eq('prename LIKE', "%".$searchValue."%")
                    ->eq('name LIKE', "%".$searchValue."%");
            }
            return $or;
        });
        return $orConditions;
    })
    ->all();

Кроме того, это действительно личное предпочтение, но технически вы все равно можете использовать форматирование массива для такого запроса (вложенный набор ИЛИ), например:

$searchValueArr = ["keyword1","keyword2"];
$searchTerms = [];
foreach($searchValueArr as $searchValue) {
    $searchTerms[] = [
        'OR' => [
            'prename LIKE' => "%".$searchValue."%",
            'name LIKE' => "%".$searchValue."%"
        ]
    ];
}
$customers = $customersTable->find()
    ->where([
        'OR' => $searchTerms
    ])
    ->all();
...