Domanda

Mi chiedo se sia possibile creare una relazione hasMany in un modello che utilizzi l'ID dell'utente connesso.

Esempio:Un suggerimento ha molti voti (da utenti diversi).Questo è facile:

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

Ora voglio ricevere tutti i suggerimenti ma voglio sapere se l'utente che ha effettuato l'accesso ha già votato questo suggerimento.Quindi vorrei creare una relazione che assomiglia a questa:

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' => ''
    )
);

Come posso inserire $loggedinUser_id in questo modello?Oppure è un pessimo modo di implementare questo problema?Dovrei piuttosto cercare una ricerca separata sul modello TipVoting?

Qualche idea?

Grazie!

È stato utile?

Soluzione

Usa il comportamento contenibile. http://book.cakephp.org/view/474/Containable

Se non si desidera definire un rapporto diverso, si vuole solo essere in grado di filtrare in base a criteri associati. Contenibile vi permetterà di fare questo.

Con solo il rapporto TipVoting, nel modello fare questo:

var $actsAs = array( 'Containable' );

nella vostra azione di controllo fare questo:

$this->TipVoting->find( 'all', array( 
 'contain' => array( 
   'Vote' => array( 
    'conditions' => array( 
      'TipVoting.user_id' => $this->Auth->User('id') ), 
    'order' => 'TipVoting.id DESC' ) ) );

Altri suggerimenti

Se ho capito la domanda, quello che cerchi veramente è un modo per definire la condizione una volta piuttosto che un modo per definire una condizione specifica del join.IL Containable il comportamento gestirebbe quest’ultimo, ma non il primo.A quello scopo...

Non sono a conoscenza di alcun modo per utilizzare i valori delle variabili nella definizione di join.Poiché si tratta di variabili di classe, sospetto che non sia possibile farlo (disclaimer:non ho provato).Hai anche la complessità aggiuntiva di provare ad accedere a quello che normalmente è un valore di sessione (l'utente autorizzato) a livello di modello, qualcosa di un MVC no-no nel senso più stretto.

Ciò che ho fatto per soddisfare esigenze simili è una combinazione di cose è la seguente:

Io uso il mio AppController per inoltrare le informazioni sull'utente autenticato:

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

Nel tuo modello, crea un file beforeFind() callback che modificherà la struttura della query:

# 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;
}

Questo codice è solo uno snippet che soddisfa un'esigenza simile al tuo quindi potrebbe non funzionare direttamente, ma dovrebbe darti un'idea di cosa è possibile e penso che potrebbe anche essere abbastanza vicino a quello che stai cercando.Tieni solo presente che probabilmente dovrai apportare alcune modifiche qua e là.

La chiave è che stai mantenendo la struttura MVC "corretta" inoltrando esplicitamente le informazioni sulla sessione al modello (invece di chiedere al modello di accedervi direttamente) mentre imposti la condizione della query per utilizzare un valore di sessione ogni volta che i record del modello vengono recuperato a meno che non sia già coinvolta una condizione incentrata sull'utente.

Non è perfetto per quello che stai cercando, ma non dovrebbe volerci troppo tempo per adattarlo alle tue esigenze.

Provare a utilizzare bindModel dal appControllers beforeFilter.

...
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
                        ...
                    ),
                    ...
                ),
                ...
            ),
        );
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top