Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: интерфейс функции "поиска"
Форумы портала PHP.SU » » Объектно-ориентированное программирование » интерфейс функции "поиска"

Страниц (2): [1] 2 »
 

1. DlTA - 18 Февраля, 2015 - 18:00:42 - перейти к сообщению
суть проблемы
в очередной раз пишу класс чего то там
и мне нужно в системе делать выборку объектов по фильтрам, (вес, дата, длина, ....)

мне известны 2 варианта как это реализовывать
1) в функцию выборки передаются много параметров, каждый из которых соответствуюет какому либо из критериев поиска fun(a,b,c,d, ...)
2) в функцию передается массив (ассоциативный) и на основе того чему равны значения делать выборку fun([a=>vA, b=>vB, ...])

но чет мне эти оба варианта не по душе
может у кого есть более интересные варианты?
2. GoDr - 18 Февраля, 2015 - 19:02:24 - перейти к сообщению
а чем не по душе то? Передавай массив..
PHP:
скопировать код в буфер обмена
  1. // наши данные
  2. $data['param1'] = 'val1';
  3. $data['param2'] = 'val2';
  4. $data['param3'] = 'val3';
  5.  
  6. // делаем запрос
  7. qqq($data);
  8.  
  9.  
  10. function qqq($data = array())
  11. {
  12.     $where = array();
  13.  
  14.     // формируем условие
  15.     foreach ($data as $key => $value) {
  16.         $where[] = "`" . $key . "`='" . $value . "'";
  17.     }
  18.     // окончательный запрос
  19.     $sql = "SELECT * FROM `table` WHERE " . implode(' AND ', $where);
  20.  
  21.     // смотрим что получилось
  22.     echo $sql;
  23. }


ну или смотри ещё func_get_args(), но это будут уже навороты
3. Мелкий - 18 Февраля, 2015 - 19:05:09 - перейти к сообщению
Текучий интерфейс фильтров, говорящий на языке предметной области.
PHP:
скопировать код в буфер обмена
  1. $rObjectCollection = \Object::search()
  2. ->date('требуемая дата')
  3. ->weight('требуемый вес')
  4. ->execute();
4. DlTA - 18 Февраля, 2015 - 22:23:37 - перейти к сообщению
Мелкий пишет:
Текучий интерфейс фильтров
ну вроде красиво, теперь другой момент
получается что для каждого фильтра нужно лепить отдельный класс, если я хочу чтоб IDE мне корректно подсказывала имеющиеся методы (PHPDoc)
или есть еще варианты?
(Добавление)
GoDr пишет:
а чем не по душе то? Передавай массив..

вообще из-за отсутствия стандартов в написании параметров, а посему очень легко допустить ошибку

и хочется по максимуму переложить подсказку на IDE
5. DelphinPRO - 18 Февраля, 2015 - 23:33:04 - перейти к сообщению
DlTA пишет:
получается что для каждого фильтра нужно лепить отдельный класс, если я хочу чтоб IDE мне корректно подсказывала имеющиеся методы (PHPDoc)


Текучий интерфейс основан на возврате $this в методах. И PHPDoc это прекрасно понимает.
6. DlTA - 19 Февраля, 2015 - 09:00:45 - перейти к сообщению
DelphinPRO пишет:
Текучий интерфейс основан на возврате $this в методах. И PHPDoc это прекрасно понимает.
это при условии что я для каждого такого фильтра пишу отдельный класс

прикинул что можно сделать некий класс с методами __call
а дальше его наследовать , и в наследнике в секции PHPDoc у класса
описывать
PHP:
скопировать код в буфер обмена
  1. /**
  2.  *
  3.  * @method Mag fun1() fun1(mixed $var) ...
  4.  * @method Mag fun2() fun2(mixed $var) ...
  5.  */
  6. class Mag
7. Sail - 19 Февраля, 2015 - 09:59:10 - перейти к сообщению
DlTA пишет:
DelphinPRO пишет: пишет:

Текучий интерфейс основан на возврате $this в методах. И PHPDoc это прекрасно понимает.
это при условии что я для каждого такого фильтра пишу отдельный класс

Однако, не отдельный класс, а метод в классе, для которого определяется набор фильтров.
8. Мелкий - 19 Февраля, 2015 - 09:59:49 - перейти к сообщению
Как раз-таки для каждого фильтра объектов лепить свой класс. Иначе на языке предметной области вы говорить не сможете и получите банальнейший query builder.
9. GoDr - 19 Февраля, 2015 - 15:28:24 - перейти к сообщению
Цитата:
вообще из-за отсутствия стандартов в написании параметров, а посему очень легко допустить ошибку
Не вижу проблему. Опиши в классе допустимые поля таблиц: не совпало - викинь. Опиши правил для значений: получил значение - проверь его или приведи к нужному типу.

А предусмотреть в проекте все фильтры.. ну как-то не разумно.. Конечно если есть только одна таблица и узкая задача.... Подмигивание
10. DlTA - 19 Февраля, 2015 - 17:15:56 - перейти к сообщению
GoDr пишет:
Не вижу проблему. Опиши в классе допустимые поля таблиц: не совпало - викинь. Опиши правил для значений: получил значение - проверь его или приведи к нужному типу.
проблема? а кто говорил о проблеме, я в поиске более логично практичного и удобного решения, так как те что юзаю меня не устраивают, они громоздкие и/или сложно стандартизируются
11. GoDr - 19 Февраля, 2015 - 21:00:44 - перейти к сообщению
DlTA, ну суть наверное заключается что бы ты в своей IDE начинал вводить код (или Ctrl+Spase), а тебе подсказки ? Закатив глазки

куда ещё логичнее передать массив... Хотя можно создать и красивый вариант.
CODE (htmlphp):
скопировать код в буфер обмена
  1. class Search
  2. {
  3.     public $ves = 0;
  4.     public $massa = 0;
  5.     public $rost = 0;
  6.     public $vozrast = 0;
  7. }
  8.  
  9. $where = new Search();
  10.  
  11. $where->ves = 40;
  12. $where->massa = 50;
  13. $where->rost = 232;



вот картинка PhpStorm.. очень красиво даже Язычок
12. DlTA - 19 Февраля, 2015 - 21:11:31 - перейти к сообщению
GoDr, если обратить внимание не первый пост, то там видно, что это всего лишь один из тех вариантов (похожий) , которые юзать не хочеться, из за своей громоздкости
в чем громоздкость? показываю
к примеру нужно передать пол десятка параметров
PHP:
скопировать код в буфер обмена
  1. $oSh = new Search;
  2. $oSh->wes=$_GET['wes'];
  3. //...
  4. $oSh->massa=$_GET['massa'];
если сильно со стороны посмотреть, то заметно что мы вынужнены постоянно "копипастить" одно и тоже (создал класс и погнал подставлять значения)

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


но я таки решил упростить жизнь и передать массив
СObj::filter($_GET)
и уже внутри валидация параметров и т.д.
13. GoDr - 19 Февраля, 2015 - 21:20:24 - перейти к сообщению
DlTA пишет:
но я таки решил упростить жизнь и передать массив
СObj::filter($_GET)

ну тогда уж вообще просто так
Зачем же передавать Глобальный массив Улыбка
Я частенько таким балуюсь.. Просто вызываю метод, а в нём уже вся обработка
14. DlTA - 19 Февраля, 2015 - 21:22:07 - перейти к сообщению
GoDr пишет:
Зачем же передавать Глобальный массив
Я частенько таким балуюсь.. Просто вызываю метод, а в нём уже вся обработка

зря,
а если нужно будет вызывать фильтр не из формы а из другого места? вот и прийдется все переделывать
15. GoDr - 19 Февраля, 2015 - 21:26:00 - перейти к сообщению
ничего не понял... Если ты передаёшь $_GET в функцию, то в функции нужно создать локальная переменная , которая является копией $_GET. Если её не передавать, то можно просто напрямую использовать $_GET без создания локальных переменных.. И при чём тут "вызывать фильтр не из формы а из другого места"

 

Powered by ExBB FM 1.0 RC1