2014-01-23 3 views
2

Я чувствую себя довольно глупым, чтобы задавать этот вопрос, но я сбитый с толку, вероятно, потому, что я немного запугался cakePHP (новичок и не очень удобен), но его достоинства практически заставляют меня использовать Это. Поэтому, если вы могли бы помочь, я ценю это:cakePHP- получение из базы данных. Модели Ассоциации и база данных

Моя проблема заключается в понимании того, как работает модельная ассоциация. Пройдя весь раздел об ассоциациях, я все еще боюсь, и на самом деле я не совсем уверен, ошибочны ли мой дизайн базы данных или ассоциации между моделями.

Вот она: У меня есть 3 модели, которые являются: Донор, BloodGroup, DonorType

Начнем с того, что я не совсем уверен, если я должен создать модель для каждой таблицы в БД. Мои таблицы выглядеть следующим образом:

+-------donors-------+ 
| donor_id (pk)  | 
| name    | 
| surname   | 
| donor_type_id (fk) |  
| blood_group_id (fk)| 
|     | 
+--------------------+ 
+----donor_types-----+ 
| type_id (pk)  | 
| type    | 
|     | 
+--------------------+ 

+----blood_groups----+ 
| blood_group_id(pk) | 
| group    | 
|     | 
+--------------------+ 

Донор Модель

class Donor extends AppModel{ 
    public $hasOne = array(
     'BloodGroup'=> array(
      'className' => 'BloodGroup' 

     ), 
     'DonorType' => array(
      'className' => 'DonorType' 
     ) 
    ); 

По таблицам в базе данных, выше, как отношения могут быть описаны. Я уже использую ассоциацию, чтобы зарегистрировать новый донор со значениями извлеченных из группы крови таблица/модели, используя этот код в моем контроллере:

$ this-> набор («bloodGroups», $ this-> Донор -> BloodGroup-> find ('list', array ('fields' => array ( 'BloodGroup.blood_group_id', 'BloodGroup.blood_group' ) ) ));

Поэтому я думаю, что ассоциация верна. Однако, теперь я хочу, чтобы отобразить сохраненные пользователям соответствующие детали, но генерируется ошибка SQL:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'BloodGroup.donor_id' in 'on clause' 

Это конечно, потому что нет «donor_id» как Ф.К. внутри таблицы BloodGroup, на самом деле в таблице доноров есть blood_group_id как fk. Итак, каково это решение? Является ли дизайн db ошибочным или есть способ, которым я могу переопределить ассоциацию внутри пирога?

ответ

2

Возможно, что-то не так в вашей настройке.

  1. Вы не соблюдаете правила использования торта. Если ваши руки не связаны (например, внешний источник данных вы не контролируете), ваш первичный ключ всегда следует называть id, а не table_name_id. Торт всегда ищет id ключей по умолчанию. Если у вас нет выбора, вы можете установить собственный первичный ключ, установив в своей модели свойство primaryKey.
  2. Посмотрев на свои столы, вы, кажется, смешиваете hasOne с belongsTo. Хотя на простом английском языке звучит логично, что у донора есть одна группа крови, с точки зрения базы данных, донор относится к определенной группе крови. В руководстве есть некоторые замечания, которые помогут вам выбрать правильный:

hasOne:другой модель содержит внешний ключ.
относится к:текущий модель содержит внешний ключ.

Это также иллюстрируется некоторыми примерами в документации (см. Ссылки выше). Последнее один верно в вашем случае, так что ваша модель должна в конечном итоге выглядеть следующим образом:

class Donor extends AppModel { 

    public $belongsTo = array(
     'BloodGroup', 
     'DonorType' 
    ); 

} 
+0

спасибо за разъяснение hasOne/belongsTo .. О первичном ключе, что, если мне нужно, чтобы иметь 'Эхо $ this-> Form-> input ('blood_group_id') echo $ this-> Form-> input ('type_id') ' – LogixMaster

+1

Вы можете отлично это сделать из формы для' Donor'. Торт даже помогает вам, если вы следуете соглашениям и устанавливаете '$ bloodGroups' и' $ type' в качестве массивов для своего представления, и он будет создавать выпадающие списки со всеми возможными значениями из связанных моделей. – Oldskool

+0

Первое, большое спасибо Oldskool! Во-вторых, да, я сейчас это делаю! Итак, как я скажу cakePHP, что '$ this-> Form-> input ('id')' для таблицы blood_group И '$ this-> Form-> input ('id')' для таблицы donor_type не то же самое? Знает ли он внутренне каким-то образом? – LogixMaster

Смежные вопросы