php – 不能变化

前端之家收集整理的这篇文章主要介绍了php – 不能变化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用这个 extension实现ActiveRecord类FaqCategory的i18n功能.
这是我的表:
CREATE TABLE `FaqCategory` 
(
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`icon` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

CREATE TABLE 
`FaqCategoryTranslation` 
(
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,`catID` int(10) unsigned DEFAULT NULL,`languageID` tinyint(2) unsigned NOT NULL,`title` varchar(255) DEFAULT NULL,`slug` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),KEY `catID` (`catID`) USING BTREE,KEY `languageID` (`languageID`),CONSTRAINT `FCT_FK1` FOREIGN KEY (`catID`) REFERENCES `FaqCategory` (`id`) ON DELETE             CASCADE ON UPDATE CASCADE,CONSTRAINT `FCT_FK2` FOREIGN KEY (`languageID`) REFERENCES `Language` (`id`) ON   DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8

CREATE TABLE `Language` 
(
  `id` tinyint(2) unsigned NOT NULL AUTO_INCREMENT,`locale` varchar(2) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

FaqCategory型号:

class FaqCategory extends \yii\db\ActiveRecord
{

    public function behaviors()
    {
        return [
            'translationBehavior' => [
                'class' => VariationBehavior::className(),'variationsRelation' => 'translations','defaultVariationRelation' => 'defaultTranslation','variationOptionReferenceAttribute' => 'languageID','optionModelClass' => Language::className(),'defaultVariationOptionReference' => function () {
                    return Yii::$app->language;
                },'variationAttributeDefaultValueMap' => [
                    'title' => 'name'
                ],],];
    }

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'FaqCategory';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['icon','name'],'string','max' => 255]
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID','name' => 'Name','icon' => 'Icon',];
    }

    public static function find()
    {
        return parent::find()->with('defaultTranslation');
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getTranslations()
    {
        return $this->hasMany(FaqCategoryTranslation::className(),['catID' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getDefaultTranslation()
    {
        return $this->hasDefaultVariationRelation(); // convert "has many translations" into "has one defaultTranslation"
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getFaqs()
    {
        return $this->hasMany(Faq::className(),['catID' => 'id']);
    }

创建动作:

public function actionCreate()
    {
        $model = new FaqCategory();

        $post = Yii::$app->request->post();
        if ($model->load($post) && Model::loadMultiple($model->getVariationModels(),$post) && $model->save()) {
            return $this->redirect(['index']);
        } else


        return $this->render('create',[
            'model' => $model,]);
    }

并查看文件

<div class="faq-category-create">

    <h1><?= Html::encode($this->title) ?></h1>

    <div class="faq-category-form">

        <?PHP $form = ActiveForm::begin(); ?>

        <?= $form->field($model,'name'); ?>

        <? foreach ($model->getVariationModels() as $index => $variationModel): ?>
            <?= $form->field($variationModel,"[{$index}]title")->label($variationModel->getAttributeLabel('title') . ' (' . $variationModel->languageID . ')'); ?>
        <?PHP endforeach; ?>

        <div class="form-group">
            <?= Html::submitButton('Save',['class' => 'btn btn-primary']) ?>
        </div>

        <?PHP ActiveForm::end(); ?>

    </div>

</div>

在前端:

public function actionIndex()
    {
        $categories = FaqCategory::find()->with('translations')->all();
        return $this->render('index',["categories" => $categories]);

    }

查看actionIndex文件

<div class="cat-descr"><?= $category->title ?></div>

一切都OK,所有的数据都被正确地发送到具有languageID的FaqCategoryTranslation表中.但是,当我想从转换表中获取这些值时,它只返回FaqCategory表中名称字段的值.最后,我没有完全了解AttributeDefaultValueMap.这个属性用于什么?换句话说,如果我们的默认应用程序语言是例如,为什么不使用en标题作为默认值.
谢谢!

我想你应该参考这个: https://github.com/yii2tech/ar-variation

例如:

$items = Item::find()->with('translations')->all(); // only 2 queries will be performed
foreach ($items as $item) {
    echo $item->title . '<br>'; // add other stuffs you want to produce,like name,id or whatever you may have.
    var_dump($item->defaultTranslation);  // no extra query,`defaultTranslation` is populated from `translations`
}

猜你在找的PHP相关文章