代码之家  ›  专栏  ›  技术社区  ›  joni

如何在find()和fieldlist中包含关联

  •  0
  • joni  · 技术社区  · 14 年前

    我希望通过find(all)接收模型数据,但是用户应该只得到一组受限制的表字段。这很简单:

    $ret = $this->find('all',array('fields'=>array(
        'Employee.id','Employee.address_id'
    )));
    

    但这种模式(雇员模式)也有一个贝尔朗斯托协会:

    var $belongsTo = array(
        'Address' => array(
            'className' => 'Address',
            'foreignKey' => 'address_id',
            'fields' => array('Address.full_name')
        )
    );
    

    我想要 Address.full_name 字段也将出现在我提取的数据中。但它不适用于上面的find()调用,并且在尝试此操作时会引发一个错误(SQL错误:1054:未知列“address.full”in“field list”):

    'fields'=>array('Employee.id','Employee.address_id','Address.full_name')
    

    有人知道怎么解决这个问题吗?

    编辑: 我完全忘记了地址。全名是一个虚拟字段。看看cakephp生成的SQL,很明显为什么它不起作用:

    SELECT
        `Employee`.`id`, `Employee`.`address_id`, `Address`.`full_name`
    FROM
        `employees` AS `Employee`
        LEFT JOIN `addresses` AS `Address`
            ON (`Employee`.`address_id` = `Address`.`id`)
    WHERE 1 = 1
    

    在地址模型中,全名的定义如下:

    var $virtualFields = array(
        'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)'
    );
    

    那么,问题是:这是一个cakephp错误,它不能在find()提供的fieldlist中包含(外部模型的)虚拟字段吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Daniel Wright    14 年前

    不幸的是,您不能以您希望的方式使用虚拟字段。从 Limitations of Virtual Fields 在蛋糕文档中:

    1.3中的virtualfields实现有一些限制。首先,不能在条件、顺序或字段数组的关联模型上使用virtualfields。这样做通常会导致SQL错误,因为字段不会被ORM替换。这是因为很难估计找到相关模型的深度。

    看起来你必须使用可控制的行为。

        2
  •  0
  •   Mark Northrop    14 年前

    在这种情况下,我会使用可控制的行为。

    首先确保将可包含的行为加载到员工模型中:

    var $actsAs = array('Containable');
    

    然后,当您试图获取数据时,请这样做:

    $params = array('fields' => array('Employee.id', 'Employee.address_id'), 
        'contain' => array('Address' => array('fields' => array('Address.full_name')));
    $ret = $this->find('all', $params);
    

    关于可控制行为的更多信息: http://book.cakephp.org/view/1323/Containable

        3
  •  0
  •   Leo    14 年前

    SQL错误:1054:未知列 “字段列表”中的“address.full”名称)

    这个错误给了您一个提示,您的列名调用有问题(可能是 fullname 而不是 full_name )或者,更可能是您的模型定义。员工属于某个地址,但该地址是否有一个或多个员工?