Как добавить в AR модель свое свойство?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
mclighter
Сообщения: 17
Зарегистрирован: 2012.11.06, 09:03

Как добавить в AR модель свое свойство?

Сообщение mclighter »

Добрый день!

Есть модель File, на основе таблицы с полями - id, url, name.
В модели добавлено свойство:

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

public function getFileUrl()
    {
        return $this->url.$this->name.".jpg";
    }
 
что надо сделать чтобы File::findOne(130) возвращало объект с полем fileUrl ?
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Как добавить в AR модель свое свойство?

Сообщение astronin »

во первых, вы добавили метод, а не свойство

попробуйте вписать в attributes() 'fileUrl'
mclighter
Сообщения: 17
Зарегистрирован: 2012.11.06, 09:03

Re: Как добавить в AR модель свое свойство?

Сообщение mclighter »

Сделал так

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

public function attributes()
    {
        return array_merge(
            parent::attributes(),['fileUrl']
        );
    }
 
не помогло.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Как добавить в AR модель свое свойство?

Сообщение maleks »

Что значит с полем?
Так же оно же выдает результат и окей?:

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

File::findOne(130)->fileUrl
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Как добавить в AR модель свое свойство?

Сообщение maleks »

Хотя через attributes() может выйти если еще вдобавок и сеттер объявить для данного св-ва.
mclighter
Сообщения: 17
Зарегистрирован: 2012.11.06, 09:03

Re: Как добавить в AR модель свое свойство?

Сообщение mclighter »

вы правы не с полем, объект с атрибутом fileUrl.

Сеттер также объявлен, но он тут не нужен.
File::findOne(130)->fileUrl ничего не возвращает
File::findOne(130)->getFileUrl() возвращает значение атрибута. Но мне это не подходит. Мне нужен весь объект.

А вот через REST API атрибут как поле доступен, достаточно включить его в fields() и описать геттер.

Привожу весь класс, может что-то упустил:

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

class File extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'File';
    }

    public function rules()
    {
        return [
            [['url', 'name'], 'safe'],
            [['url', 'name', 'fileUrl'], 'string']
        ];
    }

    public function fields()
    {
        return [
            'id',
            'url',
            'name',
            'fileUrl',
        ];
    }

    public function attributes()
    {
        return array_merge(
            parent::attributes(),['fileUrl']
        );
    }

    public function setFileUrl($value)
    {
        $this->fileUrl = $value;
    }

    public function getFileUrl()
    {
        return $this->url.$this->name.".jpg";
    }
}

 
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Как добавить в AR модель свое свойство?

Сообщение maleks »

>> File::findOne(130)->fileUrl ничего не возвращает

а если attributes() не переопределять, то возвращает?
mclighter
Сообщения: 17
Зарегистрирован: 2012.11.06, 09:03

Re: Как добавить в AR модель свое свойство?

Сообщение mclighter »

да, так возвращает.
но мне надо в объекте
Noobie
Сообщения: 29
Зарегистрирован: 2014.06.03, 13:38

Re: Как добавить в AR модель свое свойство?

Сообщение Noobie »

А если вот так

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

public $fileUrl;
public function afterFind()
    {
        $this->fileUrl =  $this->url.$this->name.".jpg";
    }
 
mclighter
Сообщения: 17
Зарегистрирован: 2012.11.06, 09:03

Re: Как добавить в AR модель свое свойство?

Сообщение mclighter »

Большое спасибо!
так все отлично работает. именно так как хотел.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Как добавить в AR модель свое свойство?

Сообщение lynicidn »

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

/**
@property string $fileUrl read-only
**/
...
public function getFileUrl()
    {
return $this->url.$this->name.".jpg";
    }
читабельнее

p.s. findOne и так вернет тебе модель, в которой будет этот геттер, phpDoc может тебя смутил что геттер не сработает
Ответить