Страница 1 из 1

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

Добавлено: 2014.10.09, 10:14
mclighter
Добрый день!

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

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

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

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

Добавлено: 2014.10.09, 10:28
astronin
во первых, вы добавили метод, а не свойство

попробуйте вписать в attributes() 'fileUrl'

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

Добавлено: 2014.10.09, 10:43
mclighter
Сделал так

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

public function attributes()
    {
        return array_merge(
            parent::attributes(),['fileUrl']
        );
    }
 
не помогло.

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

Добавлено: 2014.10.09, 11:02
maleks
Что значит с полем?
Так же оно же выдает результат и окей?:

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

File::findOne(130)->fileUrl

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

Добавлено: 2014.10.09, 11:05
maleks
Хотя через attributes() может выйти если еще вдобавок и сеттер объявить для данного св-ва.

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

Добавлено: 2014.10.09, 11:51
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";
    }
}

 

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

Добавлено: 2014.10.09, 13:41
maleks
>> File::findOne(130)->fileUrl ничего не возвращает

а если attributes() не переопределять, то возвращает?

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

Добавлено: 2014.10.09, 14:13
mclighter
да, так возвращает.
но мне надо в объекте

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

Добавлено: 2014.10.11, 14:08
Noobie
А если вот так

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

public $fileUrl;
public function afterFind()
    {
        $this->fileUrl =  $this->url.$this->name.".jpg";
    }
 

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

Добавлено: 2014.10.14, 09:28
mclighter
Большое спасибо!
так все отлично работает. именно так как хотел.

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

Добавлено: 2014.10.14, 17:09
lynicidn

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

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

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