cakePHP hasOne为空

时间:2015-08-12 10:18:41

标签: mysql cakephp

我是CakePHP的新手,我有一个关系问题。

我的模型看起来像这样:

JNICALL

和我的表看起来像这样:

<?
class Operator extends AppModel
{
    var $name = 'Operator';
    var $hasOne = array('Contact','Adress','Land');
}
?>

但cakePHP没有显示任何数据,例如往来 enter image description here

我做错了什么?

3 个答案:

答案 0 :(得分:6)

hasOne关系仅在您具有1 to 1关联时才能访问,以便能够访问模型中没有外键的关联模型。

属于关联

在您的情况下,您希望使用belongsTo,只要模型中的外键指向另一个模型,就会使用belongsTo,您的Operator模型具有外键指向ContactAddressLandcontact_idaddress_idland_id

由于contact_id字段位于Operator模型中,因此Operator模型属于 Contact模型。

class Operator extends AppModel {
    public $belongsTo = array('Contact') ;
}

在获取Operator条目时,您会得到类似的内容:

Array(
    [Operator] => Array
        (
            [id] => 42,
            [name] => 'operator',
            [contact_id] => 33
        )
    [Contact] => Array
        (
            [id] => 33,
            [name] => 'contact'
        )
)

hasOne和hasMany

由于您的Operator 属于 Contact,您的Contact hasOne hasMany Operator。让我们来说明两者之间的区别:

  1. 您的每个Contact条目仅与一个 Operator相关联,您可以在operator_id模型中添加Contact个外键,但这将是多余的,因为您已在contact_id中使用Operator建立关联。因此,您要做的是在Contact模型中创建 hasOne 关联,因此Contact hasOne Operator
  2. class Contact extends AppModel {
        public $hasOne = array('Operator') ;
    }
    

    同样,在获取Contact条目时,您将获得:

    Array(
        [Contact] => Array
            (
                [id] => 33,
                [name] => 'contact'
            )
        [Operator] => Array
            (
                [id] => 42,
                [name] => 'operator',
                [contact_id] => 33
            )
    )
    

    请注意,这与使用 belongsTo Operator编辑Contact时相同。 hasOnebelongsTo之间的区别主要是哪个模型的外键指向另一个。

    1. 您的Contact条目的Eah与多个Operator相关联,在这种情况下,您的Contact hasMany Operator
    2. class Contact extends AppModel {
          public $hasMany = array('Operator') ;
      }
      

      再次,$this->Contact->find()的输出:

      Array(
          [Contact] => Array
              (
                  [id] => 33,
                  [name] => 'contact'
              )
          [Operator] => Array
              (
                  [0] => Array
                      (
                          [id] => 42,
                          [name] => 'operator 42',
                          [contact_id] => 33
                      )
                  [0] => Array
                      (
                          [id] => 47,
                          [name] => 'operator 47',
                          [contact_id] => 33
                      )
              )
      )
      

      hasAndBelongsToMany

      现在,假设一个Operator可以有多个Contact,一个Contact可以投放多个Operator。在这种情况下,您需要一个额外的表(如果您遵循CakePHP命名约定,应该称为operators_contacts),包含两个字段operator_idcontact_id

      class Contact extends AppModel {
          public $hasAndBelongsToMany = array('Operator') ;
      }
      
      class Operator extends AppModel {
          public $hasAndBelongsToMany = array('Contact') ;
      }
      

      $this->Contact->find('all')的输出类似于使用 hasMany 关系的输出,主要区别在于它们不是operator_idcontact_id字段模特。

      完整示例

      我们假设我有以下模型:CompanyEmployeeAddress以及以下约束:

      • Company有各种Employee,但只有一个CEO是其Employee
      • 的一部分
      • Company只有一个Address,每个Address最多只有一家公司

      您有以下表格:

      CREATE TABLE companies (
          id INTEGER AUTO_INCREMENT PRIMARY KEY,
          ceo_id INTEGER REFERENCES employees (id)
      ) ;
      
      CREATE TABLE employees (
          id INTEGER AUTO_INCREMENT PRIMARY KEY,
          company_id INTEGER REFERENCES companies (id)
      ) ;
      
      CREATE TABLE addresses (
          id INTEGER AUTO_INCREMENT PRIMARY KEY,
          company_id INTEGER REFERENCES companies (id)
      ) ;
      

      请注意,在这种情况下,您不能拥有包含所有约束的表,因为您在companiesemployees之间有一个循环,您需要在之后添加约束。

      以下CakePHP模型:

      class Company extends AppModel {
      
          /* A Company has many Employee. */
          public $hasMany = array('Employee') ;
      
          /* A Company has one CEO, but the key is in the Company model, 
             so it is a belongsTo relationship. */
          public $belongsTo = array(
              'CEO' => array(
                  'className' => 'Employee', // It's an Employee
                  'foreignKey' => 'ceo_id'
              )
          ) ;
      
          /* A Company has one address. */
          public $hasOne = array('Address') ; 
      
      } ;
      
      class Employee extends AppModel {
      
          /* An Employee belongs to a Company. */
          public $belongsTo = array('Company') ;
      
      } ;
      
      class Address extends AppModel {
      
          /* An address belongs to a Company. */
          public $belongsTo = array('Company') ;
      
      } ;
      

      注意我已在company_id模型中添加了Address个外键,因此Address belongsTo CompanyCompany hasOne Address我可以在address_id内放置一个Company {1}}模型,我会有Company belongsTo AddressAddress hasOne Company。我在这里做了一个随意的选择,在一个真实的应用程序中你应该想到上面两个案例中哪一个是最有意义的。

      另请注意,我定义模型的方式,没有任何内容可以阻止Employee成为CEO的{​​{1}},而不是Company Employee

      您可以在the CakePHP 2.x Book中找到更多信息。

答案 1 :(得分:4)

为此,您应该使用$belongsTo代替hasOne关系。

public $belongsTo = array(
        'Contact' => array(
            'className' => 'Contact',
            'foreignKey' => 'contact_id',   // check this
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'counterCache' => true
        )
    );

答案 2 :(得分:1)

运营商所属的xyz,而不是hasOne

hasOnebelongsTo关联相似,但不一样。为了说明差异,请考虑以下模式:

users
    id (int)
    name (string)

addresses
    id (int)
    user_id (int)
    is_home (bool)
    ... other fields ...

使用UserAddress型号。假设每个用户只有一个“主页”地址,但用户可以创建多个地址记录。

belongsTo表示该表中有一个外键字段(addresses.user_idhas*关联表示其他表具有外键(没有) users.address_id,用户不属于地址)。

总之,这些陈述将描述模型关联:

  • 用户 hasMany 地址
  • 用户 hasOne 主页地址
  • 地址 belongsTo 用户