我有一个名为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。
有人能提供帮助吗?
2条答案
按热度按时间zpgglvta1#
请看一下将对象转换为数组:
rdrgkggo2#
当然,您可以根据关系在fields()方法中添加新字段: