Модельные ассоциации и моделирование данных - PullRequest
0 голосов
/ 08 ноября 2011

Я разрабатываю веб-приложение для художественной галереи и хочу проверить, правильно ли я настроил модель данных.

У меня есть таблица people и таблица artists. Некоторые из people являются artists, а некоторые нет.

У меня также есть таблица products, и каждый product принадлежит одному artist.

Ниже приведен упрощенный вариант таблиц:

products
********
id
title
artist_id

artists
*******
id
profile
rating
person_id

people
******
id
first_name
last_name

Мне нужно иметь возможность получить имя исполнителя при выполнении метода find() на модели Product.

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

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Можно использовать bindModel & unbindModel в CakePHP для создания отношений, не основанных на автоматическом совершенстве Cake.

Так как вы были заинтересованы в поиске модели Product ,Я приведу пример, который можно вызвать из контроллера Products :

// unbind Artist
$this->Product->unbindModel(array(
  'belongsTo' => array('Artist')
));

// bind Artist & Person using explicit conditions
$this->Product->bindModel(array(
  'hasOne' => array(
    'Artist' => array(
      'foreignKey' => false,
      'conditions' => array('Artist.id = Product.artist_id')
    ),
    'Person' => array(
      'foreignKey' => false,
      'conditions' => array('Person.id = Artist.person_id')
    ),
  )
));

// return the person
$person = $this->Product->find('first', array(
  'conditions' => array(
    'Product.id' => 1 // or any other condition
  ),
  'fields' => array(
    'Person.first_name',
    'Person.last_name'
  )
));

Что здесь происходит?

Во-первых, мы отсоединяем ProductОтношения модели с моделью Artist .

Во-вторых, мы связываем модели Artist и Person , явно определяя отношения и отключаяАвтоматические соединения forigenKey от Cake.

Наконец, мы делаем «первый» поиск по модели Product и запрашиваем только « first_name » & ' last_name из Персона .

0 голосов
/ 08 ноября 2011

Каждый «Продукт» принадлежит «Артисту», и каждый «Исполнитель» имеет AndDelongsToMany «Продукт». Вам также понадобится следующая таблица:

...