HasMany Relationship and ID from other Model in CakePHP

I am wondering whether it is possible to create a hasMany Relationship in a Model which makes use of the ID of the logged in user.

Example: Один отзыв имеет много голосов (от разных пользователей). Это легко:

public $hasMany = array(
   'TipVoting' => array(
        'className' => 'TipVoting',
        'foreignKey' => 'tip_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    ));

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

public $hasMany = array(
   'MyTipVoting' => array(
        'className' => 'TipVoting',
        'foreignKey' => 'tip_id',
        'dependent' => false,
        'conditions' => array('TipVoting.user_id' => $loggedinUser_id),
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
);

Как мне получить $ loggedinUser_id в этой модели? Или это плохой способ реализации этой проблемы? Стоит ли мне искать отдельную находку в модели TipVoting?

Есть идеи?

Спасибо!

1
задан chris 1 September 2010 в 15:53
поделиться

2 ответа

Если я правильно понял вопрос, вам действительно нужен способ определения условия один раз, а не способ определения условия соединения. Поведение Containable будет обрабатывать последнее, но не первое. С этой целью...

Я не знаю, как использовать значения переменных в вашем определении соединения. Поскольку это переменные класса, я подозреваю, что это невозможно (отказ от ответственности: я не пробовал). У вас также есть дополнительная сложность при попытке доступа к тому, что обычно является значением сеанса (авторизованный пользователь) на уровне модели - что-то вроде MVC нет-нет в самом строгом смысле.

Чтобы удовлетворить аналогичные потребности, я сделал следующее:

Я использую свой AppController для пересылки информации о аутентифицированном пользователе:

# AppController
# You may or may not want to use the conditional
if( !empty( $this->data ) ) {
  $this->data['User'] = $this->Auth->user();
}

В вашей модели создайте beforeFind() обратный вызов, который изменит структуру запроса:

# Your model, e.g. TipVoting
# The data[] array will probably be keyed differently
public function beforeFind( $query ) {
  if( array_key_exists( 'active', $this->_schema ) ) {
    $conditions = !empty( $query['conditions'] ) ? $query['conditions'] : array();

    if( !is_array( $conditions ) ) {
      $conditions = array( $conditions );
    }

    if( !isset ( $conditions['user_id'] ) && !isset( $conditions[$this->alias . '.user_id'] ) ) {
      $conditions[$this->alias . '.user_id'] = $this->data['User']['Administrator'];
    }

    $query['conditions'] = $conditions;
  }

  return $query;
}

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

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

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

0
ответ дан 2 September 2019 в 21:39
поделиться

Попробуйте использовать bindModel из appControllers перед фильтром.

...
public function beforeFilter( ){
    parent::beforeFilter( );
    if( $this->Auth->user( )){
        $this->User->bindModel(
            'hasMany' => array(
                'MyTipVoting' => array(
                    'className' => 'TipVoting',
                    'foreignKey' => 'tip_id',
                    'conditions' => array(
                        'MyTipVoting.user_id' => $this->Auth->user( 'id' ),
                        //note the use of the aliased name here, not TipVoting but MyTipVoting
                        ...
                    ),
                    ...
                ),
                ...
            ),
        );
    }
}
0
ответ дан 2 September 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: