【问题标题】:hasMany relation without table having id columnhasMany 没有具有 id 列的表的关系
【发布时间】:2016-01-01 07:53:03
【问题描述】:

我正在使用CakePHP 2.5。我有下表


CompanyMaster:

  • company_master_id [PK]
  • 名称和其他列


CompanySignatoryDe​​tails:(单个公司有多个所有者)

  • company_signatory_details_id [PK]
  • company_master_id [FK]
  • 名称和其他列

现在,我想获取该公司所有所有者的公司详细信息。这是我尝试过的。

$this->CompanyMaster->bindModel(
    array(
        'hasMany' => array(
            'CompanySignatoryDetails' => array(
                'className' => 'CompanySignatoryDetails',
                'foreignKey' => false,
                'conditions' => array(
                    'CompanySignatoryDetails.company_master_id = CompanyMaster.company_master_id'
                ),
            ),
        )
    )
);


$this->CompanyMaster->recursive = 2;

$company = $this->CompanyMaster->find('first', array(
    'fields' => array('CompanyMaster.*'),
    'conditions' => $conditions,  //company id in condition
));

我收到以下错误:

Database Error 
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'CompanyMaster.id' in 'field list' 

SQL Query:
SELECT `CompanyMaster`.*, `CompanyMaster`.`id` FROM      `crawler_output`.`company_master` AS `CompanyMaster` WHERE `CompanyMaster`.`company_master_id` = 1 LIMIT 1

请告诉我如何在没有id 作为列名的情况下绑定模型。

【问题讨论】:

  • 您是否在CompanyMaster 模型类中正确定义了非标准主键?
  • @ndm 实际上我的问题引导我定义非标准主键。现在知道了,谢谢

标签: mysql cakephp cakephp-2.5 cakephp-2.x


【解决方案1】:

在处理hasMany 关系时,CakePHP 将生成一个单独的查询,因此您将无法引用另一个表中的字段。只有belongsTohasOne 关系产生JOIN

但是,您不需要为关系添加条件。以下应该可以正常工作:

$this->CompanyMaster->bindModel(array(
    'hasMany' => array(
        'CompanySignatoryDetails' => array(
            'className' => 'CompanySignatoryDetails',
            'foreignKey' => 'company_master_id',
        ),
    )
));

不要忘记为CompanyMaster 定义主键:

class CompanyMaster extends AppModel 
{
    public $primaryKey = 'company_master_id';
}

对于CompanySignatoryDetails

class CompanySignatoryDetails extends AppModel 
{
    public $primaryKey = 'company_signatory_details_id';
}

【讨论】:

    【解决方案2】:

    例如,让您的查询如下所示:

    select CompanyMaster.*,CompanySignatoryDetails.* from
    CompanyMaster as cm inner join CompanySignatoryDetails as cd on  
        cm.company_master_id=cd.company_master_id  
          order by cm.company_master_id; 
    

    您将从两个表中获取所有字段,按 company_master_id 字段排序。您可以通过像这样显式指定字段来减少此查询显示的字段数量:

    select cm.company_master_id, cd.name from....
    

    HNY!(新年快乐!!)

    【讨论】:

    • 也祝你好运!我可以手动进行该查询。但我想使用CakePHP
    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多