Хранение данных в PHP

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Хранение данных в PHP

Сообщение Bloom »

Подскажите, в модели или в контроллере правильно хранить данные, которые не имеет смысла хранить в базе.
Пример: Есть таблица названиями авто. id(int), фирма изготовитель(int), название авто(varchar).
В поле фирмы изготовителя может быть от 4х до 10 значений. Создавать отдельную таблицу с названиями не имеет смысла, т.к. лишние запросы к базе(и примите как факт! Это только пример. Мне реально не нужно создавать отдельную таблицу.)
Где и в каком формате хранить эти данные.

Моё решение:
Хранить в массиве однозначно.
В модели хранить неправильно, т.к. при каждом создании объекта модели - будет создаваться и свойство в виде полного массива данных, что не есть гуд.
Хранить в контроллере - вполне пойдет. Массив ассоциативный, маленький и простой. Объявить его как protected и через гетер сделать доступным только для чтения.

Второй вопрос.
Если мы решились хранить данные в контроллере в виде массива. Правильно ли получать конкретное значение таким вот образом??

Код: Выделить всё

protected $tip = array(
                '1' => 'Частное',
                '2' => 'Юр. лицо',
                '3' => 'Инопланетяне',
                '4' => 'Рэпперы',
        );
public function getTip($id = NULL) {
                if (isset($id)) {
                        return $this->tip["$id"];
                } else {
                        return $this->tip;
                }
        } 
Может я конечно и гоню, а нужно было объявлять константой. Но мне интересны ваши решения.

Лично я столкнулся с тем, что не могу вывести нужное мне значение в CGridView.

Код: Выделить всё

array(
                        'name' => 'tip',
                        'value' => '$data->tip', // Как мне сюда выводить не поле из базы, а ту самую вторую переменную из PHP?
                        'filter' => $this->tip,
                ),
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: Хранение данных в PHP

Сообщение because »

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

Код: Выделить всё

//предположим что tip - название поля в базе данных
static $availableTips = array(
                '1' => 'Частное',
                '2' => 'Юр. лицо',
                '3' => 'Инопланетяне',
                '4' => 'Рэпперы',
        );
public function getTipValue() {
            return self::$availableTips[$this->tip];
   }
 

Код: Выделить всё

array(
                        'name' => 'tip',
                        'value' => '$data->tipValue',
                        'filter' => ModelName::$availableTips,
                ),
 
RTFM !
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Хранение данных в PHP

Сообщение lancecoder »

лучше константами такое делать, это как никак ЕНУМ в БД
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Хранение данных в PHP

Сообщение lancecoder »

Код: Выделить всё

    const STATUS_REGISTERED = 'REGISTERED';
    const STATUS_TASK = 'TASK';
    const STATUS_BANNED = 'BANNED';
    const STATUS_DELETED = 'DELETED';

     /**
     * @return array
     */
    public static function getStatusLabels()
    {
        return array(
            self::STATUS_REGISTERED => \Yii::t('user-account', 'STATUS_REGISTERED'),
            self::STATUS_TASK => Yii::t('user-account', 'STATUS_TASK'),
            self::STATUS_BANNED => Yii::t('user-account', 'STATUS_BANNED'),
            self::STATUS_DELETED => Yii::t('user-account', 'STATUS_DELETED'),
        );
    }
    /**
     * @param integer $status
     * @return string
     * @throws CException
     */
    public static function getStatusLabel($status=self::STATUS_TASK)
    {
        $statuses=self::getStatusLabels();
        if (!isset($statuses[$status])) throw new CException(\Yii::t('user-account', 'exception: Status not support'));
        return $statuses[$status];
    } 
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: Хранение данных в PHP

Сообщение Bloom »

однозначно в модели, она отвечает за работу с данными. контроллер должен содержать логику обработки запросов пользователя
Спасибо, сам думал, что тут что-то не так. Но что получится при запросах через AR? Статические переменные, на сколько я знаю, не являются частью объекта. Они являются частью класса. Т.е. при запросах AR нам не создаст огромный объект с лишними свойствами?

Константы не есть удобно. Массив править проще лично для меня. И что произойдет с объектом при запросе с AR? Он наполнится константами?

Вопрос из незнания ООП, уж извиняйте))
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Хранение данных в PHP

Сообщение lancecoder »

константы не являются свойствами объекта, это статика класса, их нельзя изменить во время выполнения скрипта, а статику запросто
self::$static_var=$new_value
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: Хранение данных в PHP

Сообщение because »

Bloom, константы вам могут пригодиться, когда у вас появится логика, связанная со значениями в этом списке.
допустим, нужно вывести дополнительную форму, если пользователь - юр. лицо. условие без константы:
if ($object->tip == 2) { //тут форма }. В этом случае 2 - магическое число, и сразу не понять, что оно обозначает и откуда у него ноги растут.
С константой это выглядело бы примерно так if ($object->tip == User::TYPE_YURIST) { echo 'form here'; }.
и константы, и статические свойства и методы являются частью класса.
RTFM !
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Хранение данных в PHP

Сообщение lancecoder »

вообщет в коде такое не желательно вообще писать, а заюзать интерфейс, таким образом у юзера появится метод
$user->isYurist()
or
$user->isType(User::TYPE_YURIST)
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: Хранение данных в PHP

Сообщение because »

lancecoder писал(а):вообщет в коде такое не желательно вообще писать, а заюзать интерфейс, таким образом у юзера появится метод
$user->isYurist()
or
$user->isType(User::TYPE_YURIST)
согласен
RTFM !
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: Хранение данных в PHP

Сообщение Bloom »

Спасибо огромное.
Лично мой случай, когда в таблице пользователей есть поля типа ROLE STATUS TIP. Которые могут принимать очень мало значений, но хранить их желательно в INT формате. Вот на этот случай я и храню массив в самом PHP для того, чтобы не плодить много запросов к базе и не разжижать свой мозг))
Ответить