2016-07-05 3 views
1

В настоящее время я пытаюсь создать бэкэнд для проекта. В этом проекте вы сможете создать «ContentElements», который может использоваться для отображения контента на странице (в моих сайтах). Каждый ContentElement может иметь несколько опций. Когда пользователь создает новый сайт с ContentElement (например, заголовок), он вводит все параметры элемента. Например:Присоединиться к таблице с идентификатором другой таблицы соединений

"src": "/img/bg.jpg", 
"text": "Lorem ipsum..." 

Для того, чтобы сохранить стоимость опциона на странице она используется в, я хранить эти значения в отдельной таблице (content_elements_sites_values).

Моя схема в настоящее время выглядит следующим образом: data scheme

Так что я в настоящее время пытаюсь сделать это, когда я получаю все данные, связанные с Сайтом я также хочу, чтобы получить данные от «» content_elements_sites_values ​​

$site = $this->Sites->get($id, [ 
     'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements' => [ 
      'ContentElementOptions' => [ 
       'ContentElementsSitesValues' 
       ] 
      ] 
     ], 
     'conditions' => [ 
      // Just to explain my problem. 
      'ContentElementsSites.id' => 'ContentElementsSitesValues.content_elements_sites_id' 
     ] 
    ]); 

Я действительно не знаю, возможно ли это, даже если мой «дизайн» - это общий бык *** t. Но я не могу придумать другой способ хранения заполненных данных. Я очень открыт для предложений о том, как лучше хранить эти данные. Пожалуйста, спросите, нужна ли вам дополнительная информация, чтобы помочь мне.

Спасибо заранее!


EDIT

Я пытаюсь объяснить лучше, что я хочу достичь.

Каждый сайт может иметь несколько content_elements одного и того же типа (ассоциация хранится в content_elements_sites распределительную таблицу).
Каждый content_element может иметь несколько content_element_options

Все content_element_options и content_elements определяются с помощью администратора.

Другой пользователь может создать сайт и заполнить его с content_elements и введите content_elements_sites_value для всех content_element_options. И поскольку тот же самый content_element (например, абзац или список) может иметь несколько вхождений на одном и том же сайте, мне нужно будет сохранить каждый введенный пользователем content_elements_sites_value.

Вот почему я создал связь между content_elements_sites и content_element_options.

В настоящее время я использую этот запрос, чтобы получить все ожидают, что значение:

$site = $this->Sites->find('all', [ 
     'conditions' => [ 
      'Sites.id' => $id 
     ], 
     'contain' => ['ContentElements' => [ 
       'sort' => [ 
        'ContentElementsSites.order' => 'ASC' 
       ], 
       'ContentElementOptions' => [ 
        'ContentElementsSitesValues' => [ 
         'conditions' => [ 
          'ContentElementsSitesValues.content_elements_sites_id' => 'ContentElementsSites.id', 
         ] 
        ] 
       ] 
      ] 
     ] 
    ]); 

Это приводит к пустой content_elements_sites_values ​​

(int) 1 => object(App\Model\Entity\ContentElementOption) { 
    'id' => (int) 7, 
    'content_element_id' => (int) 1, 
    'name' => 'Test', 
    'json_name' => 'test', 
    'option_type_id' => (int) 1, 
    'content_elements_sites_value' => null,    
} 

Моя схема в настоящее время выглядит следующим образом: data scheme

Мне интересно, возможен ли этот запрос. Или, если все это слишком гибко.

ответ

0

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

Если это случай, направление схемы выглядит хорошо с некоторыми изменениями:

1) content_elements_sites_values ​​ таблицы может иметь site_id колонки непосредственно вместо content_elements_sites_id колонки, как сайт будет всегда уникальным для записи в этой таблице, поэтому идентификатор соединения content_elements_sites не требуется.

2) content_elements_sites_values ​​ таблица может быть переименована в content_element_options_values ​​.

3) Можно удалить ID столбец из content_elements_sites и content_elements_sites_values ​​ ответвительные таблицы.

+0

Но было бы невозможно иметь несколько вхождений _content_element_ на той же странице, если я установил ** site_id ** в ** content_elements_sites_values ​​**. Я обновлю свой вопрос, потому что я не сделал этого ясно - извините. Но вы правы, что он будет очень гибким. И это дает мне головную боль :) – Slice

+0

Я вижу. то вы можете продолжить с ** content_elements_sites_id **. Что касается запроса, вы должны использовать ** matching() ** вместо * содержать() *, потому что вы хотите ограничить результаты основной таблицы на основе условий ассоциации. Пойдите здесь шаг за шагом - сначала выберите 2 ассоциации, проверьте запрос в наборе отладки, запустите его непосредственно в базе данных, внесите необходимые изменения, а затем добавьте к нему 3-ей ассоциации и повторите. [Ссылка] (http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#retrieving-associated-data) – Gaurav

0

может быть, это то, что вы ищете:

$site = $this->Sites->get($id, [ 
    'contain' => ['Templates', 'Colors', 'SiteTypes', 'ContentElements', 'ContentElements.ContentElementOptions','ContentElements.ContentElementOptions.ContentElementsSitesValues'], 
....]); 

не забудьте определить ассоциативную связь в модели таблицы.

+0

Но это еще один способ написать тот же запрос. Я в настоящее время пытаюсь перефразировать мой вопрос. – Slice

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