CakePhp3: число регистров Select больше, чем в отношении Has Many

У меня есть одно сомнение, как это решить. У меня есть две таблицы, свойства и изображения с отношением Has Many. С одним свойством может быть связано 0,1 или более изображений. Я хочу искать свойства, которые связаны более чем с 1 изображением. Я пробовал с:

$propertiesExclusive = $this->Properties->find('all')->contain( [ 'PropertyTags', 

        'ImagesAffiliates' => function($e){
                        $e->group([ 'ImagesAffiliates.id HAVING (COUNT(ImagesAffiliates.id) > 1 )' ]);

                return $e;

        }])

    ->order(['id' => 'DESC'])->where(['exclusive' => 1])->where($defaultWhere)->limit(7)->all();

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

Я пробовал в нескольких формах, но никак.


person Rod JI    schedule 23.11.2017    source источник
comment
Можете ли вы попробовать заменить функцию содержимого на соответствие? book.cakephp.org/3.0/en/orm/   -  person SamHecquet    schedule 23.11.2017
comment
stackoverflow.com/questions/34528298/   -  person ndm    schedule 23.11.2017
comment
Я ставлю:-›matching([ 'ImagesAffiliates' =› function ($q) { return $q-›select( [ 'id', 'property_id', 'count' =› $q-›func()-›count ('*') ]) -›group(['property_id']); }]) -› И у меня есть следующая ошибка на cakephp3‹b›Warning‹/b›(2)‹/a›:explore() ожидает, что параметр 2 будет строкой, заданный массив [‹b›CORE/src/ORM/EagerLoader.php‹/b›, строка ‹b›228‹/b›]   -  person Rod JI    schedule 23.11.2017
comment
@ndm пример интересен, когда вы хотите получить глубокую ассоциацию, а отношение имеет условие, но в нашем случае нам нужно подсчитать это условие, а затем снова получить условие. Думаю, для меня недействителен.   -  person Rod JI    schedule 23.11.2017
comment
Вам не нужно использовать условия, они совершенно необязательны. Из описания в вашем вопросе все, что вам нужно, это внутреннее соединение на ImagesAffiliates (и группировка по Properties, я полагаю). Если у вас есть какие-либо дополнительные требования, кроме описанных/показанных в настоящее время, пожалуйста, обновите свой вопрос, чтобы отразить это.   -  person ndm    schedule 23.11.2017
comment
$propertiesNew = $this-›Properties-›find('all')-›select([ 'total_images' =› $propertiesNew-›func()-›count('ImagesAffiliates.id')]) ->leftJoinWith(' ImagesAffiliates') ->group(['ImagesAffiliates.property_id']) ->enableAutoFields(true)-›all(); Если я это сделаю, я получу в поле общее количество изображений свойства, но если я попытаюсь сделать, где торт говорит, что столбец total_images не существует   -  person Rod JI    schedule 23.11.2017
comment
Мне нужны все свойства, которые имеют более двух изображений в одном запросе.   -  person Rod JI    schedule 23.11.2017
comment
Ясно, мне надо было прокрутить вправо, может быть, тогда я бы правильно прочитал вопрос... Это не сработает с использованием SELECT (только), в этом случае вам нужно будет добавить условие HAVING с помощью метода Query::having().   -  person ndm    schedule 23.11.2017
comment
@ndm Спасибо, ты понял. Пришлось смешать обе вещи. Вот решение: $this->Properties->find('all')->contain('PropertyTags')->contain('ImagesAffiliates')->select([ 'total_images' => $propertiesNew->func( )-›count('ImagesAffiliates.id'), 'ImagesAffiliates.id' ]) -›leftJoinWith('ImagesAffiliates') -›group(['ImagesAffiliates.property_id']) -›enableAutoFields(true)-›order([ 'listing_entry_date' =› 'DESC'])-›where($defaultWhere)-›where(['Properties.id NOT IN' =› $exclusiveIds ])-›having(['total_images›' =› 4])- ›limit(7)-›все(); * оно работает. Спасибо :)   -  person Rod JI    schedule 23.11.2017


Ответы (1)


Спасибо @адм. Ты понял. Мне пришлось смешать выбор со ссылкой на поле total_images «псевдоним».

 $this->Properties->find('all')->contain('ImagesAffiliates')->select([ 'total_images' => $propertiesNew->func()->count('ImagesAffiliates.id'), 'ImagesAffiliates.id' ])
                ->leftJoinWith('ImagesAffiliates')
                ->group(['ImagesAffiliates.property_id'])
                ->enableAutoFields(true)->having(['total_images >' => 2])->limit(7)->all();
person Rod JI    schedule 23.11.2017