Yii:更改活动记录字段名称

oxiaedzo  于 2022-11-09  发布在  其他
关注(0)|答案(3)|浏览(181)

我是Yii的新手,我有一个表'Student',其中包含'stdStudentId''stdName'等字段。我正在编写API,所以这些数据应该以JSON格式返回。现在,因为我希望JSON中的字段名就像'id''name'一样,并且我不希望返回所有字段,所以我在模型中创建了一个方法:

public function APIfindByPk($id){
$student = $this->findByPk($id);
return array(
'id'=>$student->stdStudentId, 
'name'=>$student->stdName, 
'school'=>$student->stdSchool
);
}

问题是,stdSchool是一个关系,在这种情况下,$student->stdSchool返回包含schSchoolIdschName等字段的数组。我不希望字段在JSON中被那样命名,我也不希望返回School中的所有字段,我想添加一些我自己的字段。在Yii中有办法做到这一点吗,还是我必须通过编写这样的方法来手动完成?

trnvg8h3

trnvg8h31#

我一直在寻找同样的东西。有一个伟大的PHP库命名分形让你实现它:http://fractal.thephpleague.com/
为了简单地解释这个库,你为你的每个模型创建一个Transformer,它将在你的模型属性和需要使用api公开的属性之间进行Map。

class BookTransformer extends Fractal\TransformerAbstract
{
    public function transform(Book $book)
    {
        return [
            'id' => (int) $book->id,
            'title' => $book->title,
            'year' => $book->yr,
        ];
    }
}

在转换器中,您还可以设置此模型具有的关系:

class BookTransformer extends TransformerAbstract
{
    /**
     * List of resources relations that can be used
     *
     * @var array
     */
    protected $availableEmbeds = [
        'author'
    ];

    /**
     * Turn this item object into a generic array
     *
     * @return array
     */
    public function transform(Book $book)
    {
        return [
            'id'    => (int) $book->id,
            'title' => $book->title,
            'year'  => $book->yr,
        ];
    }

    /**
     * Here we are embeding the author of the book
     * using it's own transformer
     */
    public function embedAuthor(Book $book)
    {
        $author = $book->author;

        return $this->item($author, new AuthorTransformer);
    }
}

所以在最后你会叫

$fractal = new Fractal\Manager();
$resource = new Fractal\Resource\Collection($books, new BookTransformer);
$json = $fractal->createData($resource)->toJson();

用一个答案来描述分形的所有潜力并不容易,但你真的应该给予。我和Yii沿着使用它,所以如果你有什么问题,不要犹豫!

kh212irz

kh212irz2#

因为你使用Yii active record从数据库中获取值,所以要求数据库使用 * 列别名 *。
一般的SQL如下所示:

SELECT id AS Student_Number, name AS Student_Name, school AS School_Attending FROM student;

在Yii中,您可以将Criteria应用到findByPK()函数中,请参考:http://www.yiiframework.com/doc/api/1.1/CActiveRecord#findByPk-detail

$criteria = new CDbCriteria();
$criteria->select = 'id AS Student_Number';
$student = Student::model()->findByPk($id, $criteria);

请注意,为了使用这样的列别名,您必须在Student{}模型中定义一个虚拟属性Student_Number。

bksxznpy

bksxznpy3#

重写ActiveRecord的populateRecord()函数就可以实现这一点!
My DishType有5个属性,并覆盖populateRecord函数Yii在从数据库中获取记录时会调用此函数。
我的代码在这里!

class DishType extends ActiveRecord
{
    public $id;
    public $name;
    public $sort;
    public $createTime;
    public $updateTime;

public static function populateRecord($record, $row)
{
    $pattern = ['id' => 'id', 'name' => 'name', 'sort' => 'sort', 'created_at' => 'createTime', 'updated_at' => 'updateTime'];
    $columns = static::getTableSchema()->columns;
    foreach ($row as $name => $value) {
        $propertyName = $pattern[$name];
        if (isset($pattern[$name]) && isset($columns[$name])) {
            $record[$propertyName] = $columns[$name]->phpTypecast($value);
        }
    }
    parent::populateRecord($record, $row);
}

}

相关问题