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

cakephp:即使在beforefind中调用了contain(),可包含的行为也不适用于find()。

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

    我的问题:链接到我的 Employees 我有一张桌子 Address 包含名为 full_name (我想你可以自己想象它的作用)。我添加了可包含的行为和这个函数

    function beforeFind() {
        $this->contain('Address.full_name');
    }
    

    以我的员工模式,这样我就不必打电话 $this->contain(..) 在每个控制器动作中(我需要 全名 每一个动作都有场)。但如果控制器操作只执行 $this->Employee->find('all') (或) read(..) . 相反,如果

    • 控制器操作使用 $this->paginate(); 相反
    • $this->Employee->contain('Address.full_name'); $this->Employee->find('all'); 打电话。我无法想象为什么会这样,因为在这之后 contain(..) 呼叫, 包含(..) 由模型回调函数再次调用 beforeFind() 作为一个 debug 我把它插入cake/libs/models/behaviors/containable.php:contain()函数*cooke*。
    2 回复  |  直到 12 年前
        1
  •  1
  •   Leo    14 年前

    据我所知,对于紧随其后的查询操作,contain()语句只工作一次。后续查询将需要自己的contain()语句,例如

    $this->Employee->contain('Address.full_name');
    $this->Employee->find('all'); //first find
    // returns all of Employee + Address.full_name
    
    $this->Employee->find('all'); //second find
    // returns all of Employee + all of Address + all of any other associated tables.
    

    我不建议在beforefind()中使用contain(),因为它用于修改特定的返回。在每个查询之前使用它很快就成为第二种特性,在那里您将对返回的数据有很好的控制。

    如果您对有限回报有广泛的要求,您可以在模型的关联中设置它。

        2
  •  0
  •   Martz    14 年前

    1)您的模型beforefind()应该接受一个参数$querydata,如果执行find(),则返回true;如果在forefind之前中止,则返回false。通常,beforefind($querydata)方法将修改$querydata数组并返回它。

    function beforeFind($queryData) {
       // Modify $queryData here if you want
       return $queryData
    }
    

    2)试图保持持久的$contain有点奇怪。containable显然包含assocations,以便获取额外/附加信息。您的虚拟字段应在普通find()操作中返回。如果要限制返回的字段,则应在模型或模型关联中定义这些字段。

    var $belongsTo = array(
        'Employee' => array(
             'className' => 'Employee',
             'fields' => array('Employee.id', 'Employee.full_name'),
             'conditions' => array()
        )
    );
    

    containable将为您快速重新绑定关联,但您应该通过模型关联(belongsto、$hasmany、$hasone等)定义默认字段/条件。

    另一种选择是实际创建反映您试图获取的数据的模型方法,这是一个非常基本的示例:

    function activeEmployees() {
         $contain = array('Address');
         $conditions array('Employee.started' => '2010-09-01');
         $this->find('all', array('conditions' => $conditions, 'contain' => $contain));
    }
    

    然后从控制器调用这些方便方法,就像

    $this->员工->ActiveEmployees();

    您还可以选择将参数传递给employee::activeeemployees();这是一个附加$conditions数组,或者$contain与标准选项合并的选项。