ВОПРОС РАБОТАЕТ

Хотите написать запрос ниже с помощью cakephp 3.3

SELECT 

Books.id AS Books__id, Books.title AS Books__title, Books.for_min_age AS Books__for_min_age, Books.for_max_age AS Books__for_max_age, Books.for_min_grade AS Books__for_min_grade, Books.for_max_grade AS Books__for_max_grade ИЗ книги Книги ГДЕ 4 МЕЖДУ Books.for_min_age И Books.for_max_age ИЛИ 2 МЕЖДУ Books.for_min_grade И Books.for_max_grade

-3
Mumtaz Ahmad 31 Мар 2017 в 14:56

2 ответа

Лучший ответ

Я достигаю этого путем -

 $this->find()->where([$age . ' BETWEEN Books.for_min_age AND Books.for_max_age OR ' . $grade . ' BETWEEN Books.for_min_grade AND Books.for_max_grade']);
0
Mumtaz Ahmad 3 Апр 2017 в 07:34

Интересно, пытались ли вы найти ответ? Если бы это было так, вы бы узнали, что BETWEEN не будет работать так, как вы описали здесь. Насколько мне известно.

Следующий код работает в CakePHP, если ваши модели настроены правильно.

$age = 4;
$grade = 2;

$query = TableRegistry::get('Books')->find('all')
    ->select([
        'id', 
        'title',
        'for_min_age',
        'for_max_age',
        'for_min_grade',
        'for_max_grade'
    ]);

$query->where(function ($exp) use ($age, $grade) {
    $ageExp = $exp->and_(function ($and) use ($age) {
        return $and
            ->lte('for_min_age', $age)
            ->gte('for_max_age', $age);
    });

    $gradeExp = $exp->and_(function ($and) use ($grade) {
        return $and
            ->lte('for_min_grade', $grade)
            ->gte('for_max_grade', $grade);
    });

    return $exp->add(['OR' => [$ageExp, $gradeExp]]);
});

$data = $query->execute();

Что приведет к:

SELECT 
  Books.id AS `Books__id`, 
  Books.title AS `Books__title`, 
  Books. for_min_age AS `Books__for_min_age`,
  Books. for_max_age AS `Books__for_max_age`,
  Books. for_min_grade AS `Books__for_min_grade`,
  Books. for_max_grade AS `Books__for_max_grade` 
FROM 
  books Books 
WHERE 
  (
    (
      for_min_age <= 4 
      AND for_max_age >= 4
    ) 
    OR (
      for_min_grade <= 2 
      AND for_max_grade >= 2
    )
  )

< Сильный > ИЗМЕНИТЬ

Теоретически вы можете сделать это таким образом, но CakePHP приведёт number и number2 к строке, которая не будет работать.

$query->where(function ($exp) use ($age, $grade) {
    return $exp->or_(function ($or) use ($age) {
        return $or->between($age, 'for_min_age', 'for_max_age');
    })->between($grade, 'for_min_grade', 'for_max_grade');
});
0
Marijan 31 Мар 2017 в 13:28