Yii.如何建立三种模型(A->;B->;C)之间的关系和粗糙度


Yii. How to establish relations and crud between three models (A->B->C)

甚至无法想象如何实现下一个功能。我们拥有的:

表1:应用

id-name-//其他列

表2:app_company

id-company_name-region _id-application_id-//其他列

表3:app_region

id-区域名称

我建立了下一个关系:应用模型(一对一关系):

return array(
    'company_info' => array(self::HAS_ONE, 'AppCompany', 'applicant_id'),
    );

AppCompany模型:

return array(
    'application' => array(self::BELONGS_TO, 'Application', 'applicant_id'),    
    'region' => array(self::BELONGS_TO, 'AppRegion', 'region_id',)    
    );

AppRegion模型(顺便问一下,我真的需要这个模型吗?):

return array(
    'company' => array(self::HAS_MANY, 'AppCompany', 'region_id',) 
    );

以下是我的操作创建ApplicationContoller:

public function actionCreate()
{
    $application = new Application;
    $company = new AppCompany;
    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if(isset($_POST['Application'], $_POST['AppCompany']))
    {
        $application->attributes=$_POST['Application'];
        $company->attributes=$_POST['AppCompany'];
        $valid=$application->validate();
        $valid=$company->validate() && $valid;
        if($valid)  
        {  
            if($application->save(false))
            {
                $company->applicant_id = $application->id;
                $company->save(false);
                $this->redirect(array('view','id'=>$application->id));
            }
        }
    }
    $this->render('create',array(
        'application'=>$application,
        'company'=>$company,
    ));
}

我的_form;

<?php echo $form->errorSummary(array($application, $company)); ?>
<!-- *** -->
<div class="row">
    <?php echo $form->labelEx($company,'company_name'); ?>
    <?php echo $form->textField($company,'company_name',array('size'=>60,'maxlength'=>75)); ?>
    <?php echo $form->error($company,'company_name'); ?>
</div>
<div class="row">
    <?php echo $form->labelEx($application,'last_name'); ?>
    <?php echo $form->textField($application,'last_name',array('size'=>50,'maxlength'=>50)); ?>
    <?php echo $form->error($application,'last_name'); ?>
</div>
<div class="row">
    <?php echo $form->labelEx($company,'company_region_id'); ?>
    <?php echo $form->dropDownList($company,'company_region_id', CHtml::listData(AppRegion::model()->findAll(), 'id', 'region_title_ru'), array('empty'=>'Выберите область')); ?> // PAY ATTENTION HERE
    <?php echo $form->error($company,'company_region_id'); ?>
</div>    

因此,在创建应用程序时(AND while application是父模型),我可以通过下拉菜单为AppCompany模型选择一个区域标题。因此,当我选择app_region表中的"塔什干地区"时,我将该地区的ID(例如,7)插入app_company的region_ID列。

之后我有一个视图文件:

<?php $this->widget('bootstrap.widgets.TbDetailView', array(
'data'=>$model,
'type'=>'striped bordered condensed',
'attributes'=>array(
    'id',
    //
    'company_info.company_name',
    'company_info.date_of_foundation',
    'company_info.company_region_id' // HOW TO SHOW NO ID, BUT THE TITLE?
    'last_name',
'first_name'

因此,问题是:是否可以显示位于第三个表中的区域的名称,在该表中,它们之间无法建立直接关系?

谢谢大家,我希望我能解释清楚我需要什么。

好的,这就是我的发现将此添加到应用程序模型:

return array(
    'company_info' => array(self::HAS_ONE, 'AppCompany', 'applicant_id'),
    'region'=>array(
            self::HAS_ONE,'AppRegion',array('company_region_id'=>'id'),
                'through'=>'company_info'
        ),

之后我们可以:

<?php $this->widget('bootstrap.widgets.TbDetailView', array(
'data'=>$application,
'type'=>'striped bordered condensed',
'attributes'=>array(
    'id',
    //
    'company_info.company_name',
    'company_info.date_of_foundation',
    'region.region_title_ru', // REGION NAME WOULD BE SHOWN HERE!

我还发现,它可能表现得像:

$a->with('c.b')->find

但在我的项目

中还没有实现