Frage

Ich frage mich, ob es möglich ist, eine hasMany Beziehung in einem Modell zu schaffen, die Verwendung der ID des angemeldeten Benutzers macht.

Beispiel: Ein Tipp hat viele Votings (von verschiedenen Benutzern). Das ist einfach:

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

Jetzt möchte ich alle Tipps bekommen, aber will wissen, ob die in Benutzer haben bereits angemeldet diesen Tipp gestimmt. Also ich möchte ein Realtionship schaffen, die wie folgt aussieht:

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

Wie kann ich den $ loggedinUser_id in dieses Modell bekommen? Oder ist dies eine schlechte Möglichkeit, dieses Problem zu implementieren? Soll ich lieber gehen für einen separaten Auf der TipVoting Modell?

Irgendwelche Ideen?

Danke!

War es hilfreich?

Lösung

Verwenden Sie das contain Verhalten. http://book.cakephp.org/view/474/Containable

Sie wollen nicht, eine andere Beziehung zu definieren, Sie wollen einfach nur durch zugeordnete Kriterien zu filtern können. Contain ermöglicht es Ihnen, dies zu tun.

Mit nur TipVoting Beziehung, in Ihrem Modell dies tun:

var $actsAs = array( 'Containable' );

in Ihrer Controller-Aktion dies tun:

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

Andere Tipps

Wenn ich die Frage verstehen, was du ist wirklich ist nach eine Art und Weise, die Bedingung zu definieren einmal , anstatt eine Art und Weise einer Join-spezifische Bedingung zu definieren. Das Containable Verhalten würde behandelt die letztere, aber nicht das erstere. Zu diesem Zweck ...

Ich bin mir nicht bewusst irgendeine Weise Variablenwert zu verwenden, in Ihrer Definition beizutreten. Da diese Klassenvariablen sind, vermute ich, dass es nicht getan werden kann (Disclaimer: Ich habe nicht versucht). Sie haben auch die zusätzliche Komplexität, den Zugang zu versuchen, was normalerweise ein Sitzungswert ist (der autorisierte Benutzer) auf Modellebene -. Etwas von einem MVC no-no im engeren Sinne

Was ich getan habe ähnliche Bedürfnisse zu erfüllen, ist eine Kombination von Dingen ist die folgende:

Ich benutze meinen AppController zu Vorwärts-authentifizierten Benutzer Info:

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

In Ihrem Modell erstellen beforeFind() Rückruf, der die Abfragestruktur ändern wird:

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

Dieser Code ist nur ein Ausschnitt, der ein Bedürfnis entspricht ähnlich zu verkaufen, damit es nicht direkt arbeiten kann, aber es sollte Ihnen eine Vorstellung davon, was möglich ist und ich denke, es ist sogar ziemlich nahe sein kann was sind Sie nach. Seien Sie sich bewusst sein, dass Sie wahrscheinlich ein paar Änderungen hier machen müssen und da.

Der Schlüssel ist, dass Sie die „richtige“ MVC-Struktur sind Beibehaltung von Sitzungsinformationen zum Modell Spedition explizit (und nicht fragen, um das Modell zu Zugang direkt), während der Abfragebedingung Einstellung von jeder Zeitaufzeichnung einem Sitzungswert zu verwenden, das Modell abgerufen werden, es sei denn ein benutzerzentrierten Zustand ist bereits beteiligt.

Es ist nicht eine perfekte Passform für das, was Sie nach, aber es sollte nicht zu lange dauern, um Schneider es auf Ihre Bedürfnisse.

Versuchen bindModel vom appControllers before verwendet wird.

...
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
                        ...
                    ),
                    ...
                ),
                ...
            ),
        );
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top