yii2activerecord与关系结果转换为json

l5tcr1uw  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(322)

我有一个名为textareas的数据库表,它有一个带有主键的yii2activerecord模型 id 列(以及其他一些列,但它们并不重要)。
我还有一个名为text的表,它有一个yii2activerecord模型,名为textctrl,带有一个主键 id ,外键 textControllerId 链接到 id 在textareas中,一个名为 lang 以及一个名为 content . 一个文本区域有许多文本(在不同的语言中基本上是相同的文本)。
现在用户可以选择一种语言。然后我想从表中选择所有textarea,并根据 lang 选择用户。
通常这是通过sql连接完成的,但是我认为activerecord也应该提供这个功能。
到目前为止,我的代码是:textareas.php:

//TextAreas.php ActiveRecord model for table textAreas

class TextAreas extends ActiveRecord
{
    /**
     * @property int $id
     * @property int $width
     * @property int $height
     */

    /**
     * @ignore
     */
    public static function tableName()
    {
        return "{{textAreas}}";
    }

    /**
     * Get all textAreas and their dimensions if user is authorized and website in development mode
     */
    public static function getAllTextAreas()
    {
        // check if user is authorized and website is in development mode
        if(! Yii::$app->user->can('updateContent') || YII_ENV != 'dev')
        {
            $textArea = 'notAuthorized';
            return [$textArea];
        }

        // get all textareas and their properties
        $textArea = self::find()
            ->joinWith('text')
            ->all();

        return $textArea;
    }

    /**
     * fill textareas with content
     * @param int $lang language setting, if null language from session is used
     */
    public function getText($lang = null)
    {
        //get language from session
        if(!$lang)
        {
            $lang = LangCtrl::getStoredLanguage();
        }

        //return the content
        return $this->hasOne(TextCtrl::className(), ['textControllerId' => 'id'])
                ->where(['lang' => $lang]);
    }
}

文本表的textctrl.php activerecord模型:

//TextCtrl ActiveRecord model for text table

class TextCtrl extends ActiveRecord
{
    /**
     * @property int $id
     * @property int $textControllerId id of text block on web page
     * @property int $lang language of text
     * @property string $content the text itself
     */

    /**
     * @ignore
     */
    public static function tableName()
    {
        return "{{text}}";  
    }

    //Other methods which don't matter
}

现在,在一个控制器动作中,我这样做:

$textAreas = TextAreas::getAllTextAreas();

$response = Yii::$app->response;
$response->format = Response::FORMAT_JSON;  

return $textAreas;

结果是:

[{"id":1,"width":100,"height":16},{"id":2,"width":100,"height":16}, more database entries...]

但实际上我想要的是

[{"id":1,"width":100,"height":16,"content":"MyContent1"},{"id":2,"width":100,"height":16,"content":"MyContent2"}, more database entries...]

在哪里 content 字段中填充了 text table。
有人能提供帮助吗?

zpgglvta

zpgglvta1#

请看一下将对象转换为数组:

$textAreas = TextAreas::getAllTextAreas();

$response = Yii::$app->response;
$response->format = Response::FORMAT_JSON; 

return ArrayHelper::toArray($textAreas, [
    TextAreas::class => [
        'id',
        'width',
        'height',
        'content' => function ($data) {
            return $data->text->text;
        },
    ],
]);
rdrgkggo

rdrgkggo2#

当然,您可以根据关系在fields()方法中添加新字段:

public function fields()
{
    return array_merge(
        parent::fields(),
        [
            'content' => function () {
                if (!$this->text) {
                    return '';
                }

                return $this->text->content;
            },
        ]
    );
}

相关问题