Фильтровать результаты разбивки на страницы в CakePHP, ссылаясь на данные не связанной модели - PullRequest
0 голосов
/ 20 января 2011

Я довольно новичок в CakePHP (и в целом в фреймворках), использую версию 1.3, и натолкнулся на стену, которую я не могу найти подходящим / полезным / понятным объяснением где-либо (в документации Cake, на stackoverflow или множество поисков в Google, которые дали менее чем полезные результаты.) Может случиться так, что моему слабому мозгу нужно кормить ложкой конкретное решение, а не пытаться собрать одно из множества разных примеров, но я в недоумении, поэтому любая помощь высоко ценится! Моя ситуация такая:

Мое приложение для управления церковными ресурсами. Мне нужно отобразить ресурсы для пользователя в зависимости от его «местоположения» (подробнее об этом в секундах). Способ назначения местоположения пользователя зависит от того, к какой церкви он принадлежит, и, в свою очередь, к какому району принадлежит церковь. Ресурсы принадлежат округам, и поэтому я хочу показать пользователю в округе А только ресурсы, которые принадлежат округу А.

В моей базе данных у меня есть таблицы для users, churches, districts и items (он же "отдельный" ресурс), среди прочих, но это единственные, имеющие отношение к моей проблеме. Таким образом, у меня есть модели для User, Church, District и Item. Отношения определяются так:

District hasMany Church
District hasMany Item
Church hasMany User
Church belongsTo District
User belongsTo Church
Item belongsTo District

Как видите, между Item и User не определена прямая связь, но по сути, мне нужно сделать следующее:

$items = $this->paginate(array('Item.district_id LIKE' => 'User.district_id'));

Очевидно, что это не работает, как задумано, и просто приводит к тому, что пустой массив передается на мой взгляд.

Обратите внимание, что в моей базе данных таблица users не имеет поля district_id - все ассоциации с районом пользователя производятся с помощью отношения User->Church.district_id. Я не могу сослаться на модель User в items_controller.php, чтобы получить район пользователя напрямую, поскольку он просто выдает ошибку. Я пытался использовать «контейнерное поведение», но безрезультатно, но у меня есть ощущение, что «контейнер» - это путь, по которому мне нужно идти. Я просто не могу понять, как собрать все это вместе, чтобы оно работало. Ниже приведен соответствующий код, который у меня есть в items_controller.php, - на данный момент он довольно скудный, так как я просто пытаюсь заставить его перечислять только соответствующие элементы ... Я включу поиск и все остальное позже. Мне просто нужно знать, что сейчас я могу заставить его работать на самом базовом уровне.

items_controller.php

function admin_manager() {
    $this->paginate['Item'] = array(
        'contain' => array('User'),
        'order' => 'Item.name'
    );
    $items = $this->paginate(array('Item.district_id LIKE' => 'User.district_id'));
    $this->set('items', $items);
}

Большое спасибо за вашу помощь, и я смиренно прошу вас быть максимально конкретными с любыми примерами.

1 Ответ

0 голосов
/ 28 января 2011

Почему ваша User модель имеет district_id?Если User serveTo Church ProperTo District hasMany Item, тогда у вашего User будет church_id (при условии User hasOne Church).

Тогда вы можете попробовать это:

$conditions = array('Item.district_id'=>'Church.district_id','User.church_id'=>'Church.id');
$this->set('items',$this->paginate($this->Item->District->Church, $conditions));
...