Запрос через модель

#1 14 марта 2019 в 09:12
Всем здравия!
Необходимо выбрать записи по дате публикации без учета времени. Классический запрос будет таким:

SELECT * FROM cms_con_posts ccp
WHERE DATE_FORMAT(ccp.date_pub, '%d.%m.%Y')='04.10.2018'

Как это реализовать с помощью методов модели? Вырисовывается что-то типа такого:

$item = $this->filterEqual('date_pub', '04.10.2018')->getItem('con_posts');

Но тип поля TIMESTAMP и содержит время, как его откинуть?
#2 14 марта 2019 в 13:23
Может так:
  1. $item = $this->filterEqual(date("d.m.y",'date_pub'), '04.10.2018')->getItem('con_posts');
#3 14 марта 2019 в 13:47


Может так:

  1. $item = $this->filterEqual(date("d.m.y",'date_pub'), '04.10.2018')->getItem('con_posts');

@geminisf

Неа, получается так:

SELECT i.*
FROM cms_con_posts i
WHERE (i. = '04.10.2018')
LIMIT 1
#4 14 марта 2019 в 13:48
решения нет?
#5 14 марта 2019 в 14:06
Dimson, я бы дорисовал 00:00:00 и 23:59:59… И сделал фильтр filterBetween
Это если не гуглить.

А так идем в файл поля date.php и подсматриваем в методе applyFilter

  1.  
  2. $date_start = date('Y-m-d', strtotime($value));
  3. $date_final = date('Y-m-d', strtotime($value)+60*60*24);
  4. return $model->filterBetween($this->name, $date_start, $date_final);
  5.  
З.ы. Это двойка, тут решение есть всегда v
#6 14 марта 2019 в 14:59


Zau4man

Вопрос как раз в том, как через модель привести данные к нужному формату, например строковому, чтобы записи попали в выборку, как здесь:

SELECT * FROM cms_con_posts ccp
WHERE DATE_FORMAT(ccp.date_pub, '%d.%m.%Y')='04.10.2018'

а так получаем

SELECT i.*
FROM cms_con_posts i
WHERE (i.date_pub BETWEEN '04.10.2018' AND '05.10.2018')
LIMIT 1

и пустой результат, т.к. поле date_pub в формате TIMESTAMP и содержит помимо даты еще и время

00:00:00 и 23:59:59 дорисовал, но не спасло :(
#7 14 марта 2019 в 15:30
  1. $item = $this->filterDateYounger('date_pub', '2018-10-03')->filterDateOlder('date_pub', '2018-10-05')->getItem('con_posts');
#8 27 октября 2022 в 09:28

$item = $this->filterDateYounger('date_pub', '2018-10-03')->filterDateOlder('date_pub', '2018-10-05')->getItem('con_posts');

Ris

УТОЧНЕНИЕ.

filterDateYounger и filterDateOlder работают с датой через INTERVAL и формат '2018-10-05' здесь не уместен.

Если нужен промежуток между датами, то лучше так

  1. $items = $model->filterBetween($date_field, $first_date, $last_date)->getItem($table_name);
  2.  
  3. или
  4.  
  5. $items = $model->filterBetween($date_field, '2018-10-03', '2018-10-05')->getItem('con_posts');
  6.  
  7.  
#9 27 октября 2022 в 12:35

А что, в модели компонента написать метод с запросом и обращаться к нему, чем велосипеды изобретать, религия не позволяет)?

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.