CakePHP: связь hasOne возвращает null для полей

#php #cakephp #has-one

#php #cakephp #имеет-один

Вопрос:

У меня есть 2 модели, Venue и Contact , где 1 место имеет 1 контакт, но 1 контакт может отвечать за многие места. В моих таблицах venue.contactid ссылается на столбец contact.id

Мои модели выглядят так:

 class Contact extends AppModel {  
public $useTable = 'contact';
public $belongsTo = [
        'Contact'=>[
                'className'=>'Venue',
                'foreignKey'=>'contactid',
                'conditions'=>['Contact.id  = Venue.contactid']
        ]];
}
class Venue extends AppModel {  

public $useTable = "venue";
public $hasOne = [
        'Contact'=>[
                'className'=>'Contact',
                'foreignKey'=>'id',
                'conditions'=>['Venue.contactid = Contact.id']
        ]];
}
  

Проблема в том, что, когда я извлекаю место проведения, в Contact поле все установлено null равным .

Ответ №1:

Ваш код должен быть:

 class Contact extends AppModel {  
    public $useTable = 'contact';
    public $hasMany = [ // Has many, you said it
        'Venue'=> [ // Venue here, not Contact
            'className'=>'Venue',
            'foreignKey'=>'contactid'
        ] // No need of conditions, you don't have anything special
    ]; 
}

class Venue extends AppModel {  

    public $useTable = "venue";
    public $belongsTo = [ // the contactid is in the venue table, it's a belongsTo not a hasOne
        'Contact' => [
            'className'=>'Contact',
            'foreignKey'=>'contactid'
        ]
    ];
}
  

Вы допустили некоторые ошибки между hasOne и belongsTo и другими отношениями, посмотрите здесь http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html .

В любом случае, вы должны попытаться сохранить соглашение CakePHP, чтобы упростить свой код. Если вы измените свое поле contactid на contact_id и добавите an s к именам таблиц, ваш код станет:

 class Contact extends AppModel {  
    public $hasMany = ['Venue'] ;
}

class Venue extends AppModel {  
    public $belongsTo = ['Contact'] ;
}
  

Комментарии:

1. Спасибо за это, я попробую это, когда вернусь к работе. Я новичок в CakePHP и унаследовал базу данных от предыдущего разработчика.

Ответ №2:

Вы должны изменить свой код следующим образом.

 class Contact extends AppModel {  
     public $useTable = 'contact';
     public $belongsTo = [
      'Venue'=>[
            'className'=>'Venue',
            'foreignKey'=>'contactid',
            'conditions'=>['Venue.contactid  =  Contact.id' ]
      ]];
}
  

Комментарии:

1. Я внес изменения, но это не решило проблему

2. Вы проверяли с помощью отношения $hasMany ?