Как рассказать модели, как найти связанные с ней модели? - PullRequest
0 голосов
/ 22 декабря 2010

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

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

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

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

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

Вот запрос, части строки, которые выглядят как{$__cakeID__$} необходимо заменить на designer_id:

SELECT *, COUNT(DISTINCT tags.name) AS uniques 
FROM products, products_tags, tags, designers, designers_tags 
WHERE products.id = products_tags.product_id 
AND tags.id = products_tags.tag_id 
AND tags.id IN (
    SELECT t.id
    FROM tags t
    LEFT JOIN designers_tags dt ON dt.tag_id = t.id
    LEFT JOIN designers d ON d.id = dt.designer_id
    WHERE d.id ={$__cakeID__$}
    AND dt.include =1
)
AND products.id NOT IN ( 
    SELECT products.id 
    FROM products, products_tags, tags 
    WHERE products.id = products_tags.product_id 
    AND tags.id = products_tags.tag_id 
    AND tags.id IN (
        SELECT t.id
        FROM tags t
        LEFT JOIN designers_tags dt ON dt.tag_id = t.id
        LEFT JOIN designers d ON d.id = dt.designer_id
        WHERE d.id ={$__cakeID__$}
        AND dt.include =0
    ) 
)
AND designers.id = designers_tags.designer_id
AND designers_tags.tag_id = tags.id
GROUP BY products.id 
HAVING uniques = (
    SELECT COUNT(d.id) AS tag_count 
    FROM tags t
    LEFT JOIN designers_tags dt 
        ON dt.tag_id = t.id
    LEFT JOIN designers d 
        ON d.id = dt.designer_id
    WHERE d.id = {$__cakeID__$} 
    AND dt.include =1
    GROUP BY d.id
)

Также вот модель дизайнера:

class Designer extends AppModel 
{    
    var $name = 'Designer';

    var $actsAs = array('Sluggable' => array('separator' => '-', 'overwrite' => false, 'label' => 'name')); 

    var $hasAndBelongsToMany = 'Tag';

    var $hasOne = 'AlternateName';

    var $hasMany = 'Vote';
}

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

1 Ответ

0 голосов
/ 22 декабря 2010

Этот запрос должен работать с использованием соединения adhoc и поведения Containable:

// this assumes you are in the DesignersController
$this->Designer->Tag->find('all', array(
    'joins' => array(
        array(
            'table' => 'designers_tags',
            'alias' => 'FilterDesignersTag',
            'type' => 'INNER',
            'conditions' => array(
                'FilterDesignersTag.tag_id = Tag.id'
            )
        )
    ),
    'contain' => array('Designer', 'Product'),
    'conditions' => array(
        'FilterDesignersTag.designer_id' => $designer_id,
        'FilterDesignersTag.include' => 1
    )
));

Данные будут возвращаться, ориентированные вокруг тегов, но вы получите то, что вам нужно. Кроме того, вам необходимо убедиться, что вы определили отношения HABTM во всех трех моделях Designer, Product и Tag (тег должен иметь две ассоциации HABTM).

Кроме того, вам нужно добавить var $actsAs = array('Containable'); к вашим моделям.

EDIT

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

Если вы когда-либо использовали этот метод в своем приложении, обязательно ознакомьтесь с библиотекой CakePHP Sanitize, которая помогает в очистке предоставленных пользователем данных от атак внедрения и межсайтового скриптинга.

...