遍历关系(简单)

时间:2013-07-22 00:25:29

标签: atk4

请跟我说,我还在学习。

我有4个模型:

class Model_Users extends Model_Table {
    public $table="users";
    function init(){
        parent::init();
        $this->addField('name')->mandatory('Enter Name');
        $this->addField('email')->mandatory('Enter E-Mail');
        $this->addField('phone')->mandatory('Enter Phone');
        $this->addField('password')->type('password')->mandatory('Enter Password');
        $this->addField('is_superadmin')->type('boolean');
        $this->addField('is_employee')->type('boolean');
        $this->addField('is_manager')->type('boolean');

        $this->hasMany('companies');
    }


}

class Model_areas extends Model_Table {
    public $entity_code='areas';
    function init(){
        parent::init();
        $this->addField('name');
        $this->addField('description')->type('text');
        //$this->addField('companies_id')->refModel('Model_companies');

        $this->hasOne('companies','companies_id','name')->mandatory(true);
        $this->hasMany('sites');
    }
}

class Model_areas extends Model_Table {
    public $entity_code='areas';
    function init(){
        parent::init();
        $this->addField('name');
        $this->addField('description')->type('text');
        //$this->addField('companies_id')->refModel('Model_companies');

        $this->hasOne('companies','companies_id','name')->mandatory(true);
        $this->hasMany('sites');
    }
}

class Model_sites extends Model_Table {
    public $entity_code='sites';
    function init(){
        parent::init();
        $this->addField('name');
        $this->addField('description')->type('text');
        $this->addField('qrcode');
        //$this->addField('Company Name','areas_id')->refModel('Model_companies','name');

        $this->hasOne('areas','areas_id','name');
    }
}

我有一个简单的“网站”模型。它成功地从“区域”中提取相关的hasOne记录。我有两个问题:

1)如何更改连接区域列的列名?它只是说“区域”,而我希望它是“区域名称”

2)更复杂的一个:我如何对结果CRUD执行grid->addColumn之类的事情(或者它必须是一个网格?),这将拉动与areas_id相关联的公司名称{1}}?它的所有1对多关系。公司有多个领域。区域有多个站点。我想将公司名称添加到站点的CRUD视图中。

您可以在注释行中看到我完成此操作的一些小尝试。然后我意识到我错过了一些大事。我应该能够保持这个模型简单,只需遍历关系..

感谢您的帮助。

返回这些教程视频。

编辑:确定我想出的列名。 ->caption('Blah')。仍然无法弄清楚遍历:(

1 个答案:

答案 0 :(得分:0)

1)尝试:

$this->hasOne('areas','areas_id','name')->caption('Area Name');

2)稍微简化你的模型,就在这里。我承认 - 我没有对此进行测试,但它应该有效:

<?php
class Model_Company extends Model_Table {
    public $table = 'company';
    function init(){
        parent::init();
        $this->addField('name');
        $this->addField('description');
        $this->hasMany('Area');
    }
}

class Model_Area extends Model_Table {
    public $table = 'area';
    function init(){
        parent::init();
        $this->addField('name');
        $this->addField('description');
        $this->hasOne('Company', 'company_id', 'name');
        $this->hasMany('Site');
    }
}

class Model_Site extends Model_Table {
    public $table = 'site';
    function init(){
        parent::init();
        $this->addField('name');
        $this->addField('description');
        $this->hasOne('Area', 'area_id', 'name');

        // join area and company tables
        $j_area = $this->leftJoin('area', 'area_id');
        $j_company = $j_area->leftJoin('company', 'company_id');

        // add fields from joined tables to this model
        $j_area->addField('area_name', 'name');
        $j_company->addField('company_name', 'name');
    }
}

基本理念 - 使用连接。 - &gt; leftJoin不会创建已连接的记录,但是 - &gt; join会创建它们。只是为了报告(网格,crud等),你可以使用leftJoin。

P.S。 为自己定义某种编码规则。例如,对类名,文件名使用大写,小写,驼峰等。否则,在移动* NIX系统时,迟早会遇到问题。 很好的例子是用大写的第一个字母命名所有类名。不要忘记您的相应文件名应与您的类名完全匹配 - 也包括字母大小写。 页面类名我喜欢用小写字母命名,因为它们的名字在URL中使用,然后它看起来更好。但那只是我:)。

还有一个。如果您正在开发新项目或者只是学习ATK,那么请坚持使用最新的开发版本(可在github上获得)。自录制教程以来,有很多事情发生了变化。例如,$ entity_code已弃用 - 请改用$ table。 refModel也已经过时我猜等。 如果你想成功使用ATK,那么你必须定期查看ATK源代码以更好地理解它。还有一些有用的评论:)

祝你好运!