Попытка сделать фильтр для извлечения данных из связанных моделей - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть Post модель, которая hasMany PostField
в каждом сообщении может быть несколько полей, хранящихся в таблице post_fields.

post_fields имеет такую ​​структуру: (id, post_id, name, value)

posts таблица имеет некоторые общие поля для всех сообщений, но любые дополнительные поля должны храниться в post_fields таблице ..

Я создал форму поиска, которая используется для фильтрации сообщений

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

Я могу сначала получить сообщения, а затем отфильтровать их вручную, но я хочу что-то более эффективное!

ПРИМЕР : предположим, что сообщения описывают некоторые продукты ..

post (id, title, created, price)
post_fields (id, post_id, name, value)

в этом случае все сообщения имеют title, created и price ..
но если сообщение (id = 3) хочет иметь поле weight, мы должны сделать это, создав запись в post_fields, запись должна быть:

{ id: .. , post_id: 3, name: weight, value: .. }

теперь легко фильтровать сообщения по price (например, цена между min & max) ..
но что делать, если я хочу фильтровать сообщения в соответствии с weight ??
например Я хочу, чтобы все сообщения с weight больше 10 !!

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

, даже если у кого-то есть идея, но нет деталей, это может помочь ...

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

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Нет способа искать детей из отношений hasMany.Вам нужно будет выполнить запрос к модели PostFields.т.е.: $this->PostField->find('all', array('conditions'=>array('PostField.name' => 'weight', 'PostField.value' > 10)));

Если вы хотите выполнить запрос к обеим моделям PostField и Post одновременно (то есть: цена <$ 1,00 и вес> 10, вам нужно будет выполнить пользовательский запрос, так какCakePHP не имеет встроенного решения для этого TMK. Должно выглядеть примерно так:

$query = "SELECT ... FROM posts as Post, post_fields as PostField WHERE PostField.name = 'weight' AND PostField.value > 10 AND POST.price < 1.0 AND PostField.post_id = Post.id;"
$posts = $this->Post->query($query);

РЕДАКТИРОВАТЬ: Я бы сделал это. Вы не собираетесь сойти с рук с этимодин звонок, но это все еще чистое решение.

$postIds = null;
if(/*we need to run query against PostFields*/) {
    $conditions = array(
        'OR' => array(
            array(
                'AND' => array(
                    'PostField.name' => 'weight',
                    'PostField.value' > 10
                )
            ),
            array(
                'AND' => array(
                    'PostField.name' => 'height',
                    'PostField.value' < 10
                )
            )
        )
    );
    $fields = array('PostField.id', 'PostField.post_id');
    $postIds = $this->Post->PostField->find('list', array('conditions'=>$conditions, 'fields'=>$fields));
}
$conditions = array('Post.price' < 1.0);
if($postIds) {
    $conditions['Post.id'] = $postIds;
}
$posts = $this->Post->find('all', array('conditions'=>$conditions));
0 голосов
/ 15 апреля 2011

Вам следует изучить использование Containable для ваших моделей.Таким образом, вы можете фильтровать возвращаемые столбцы, как вам нравится.(Я думаю, что это тип фильтрации, который вы хотите сделать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...