سؤال

أتساءل عما إذا كان من الممكن إنشاء علاقة هاسمان في نموذج يستفيد من معرف المستخدم في المستخدم.

مثال: نصيحة واحدة لديها العديد من العناصر (من مستخدمين مختلفين). هذا سهل:

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

الآن أريد الحصول على جميع النصائح ولكن أريد أن أعرف ما إذا كان المستخدم الذي سجله المستخدم قد صوت هذه النصيحة بالفعل. لذلك أود أن أخلق واقعية تبدو هكذا:

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؟

أيه أفكار؟

شكرًا!

هل كانت مفيدة؟

المحلول

استخدم السلوك القابل للاحتفال. http://book.cakephp.org/view/474/containable

لا تريد تحديد علاقة مختلفة ، فأنت تريد فقط أن تكون قادرًا على التصفية حسب المعايير المرتبطة بها. يمكن أن تسمح لك احتواء القيام بذلك.

مع وجود علاقة فقط ، في نموذجك ، افعل هذا:

var $actsAs = array( 'Containable' );

في إجراء وحدة التحكم الخاصة بك ، افعل هذا:

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

نصائح أخرى

إذا فهمت السؤال ، فما الذي تتبعه حقًا هو وسيلة لتحديد الحالة بمجرد بدلا من وسيلة لتحديد حالة خاصة بالانضمام. ال Containable سوف يتعامل السلوك مع الأخير ، ولكن ليس الأول. إلى تلك النهاية...

لست على دراية بأي طريقة لاستخدام قيم متغيرة في تعريف الانضمام الخاص بك. نظرًا لأن هذه متغيرات الفصل ، أظن أنه لا يمكن القيام بذلك (إخلاء المسؤولية: لم أحاول). لديك أيضًا التعقيد المضافة لمحاولة الوصول إلى ما هو عادة قيمة جلسة (المستخدم المعتمد) على مستوى النموذج-شيء من MVC NO-NO بالمعنى الأكثر صرامة.

ما فعلته لتلبية الاحتياجات المماثلة هو مزيج من الأشياء هو ما يلي:

أنا استخدم بلدي 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 "المناسبة" عن طريق إعادة توجيه معلومات الجلسة إلى النموذج بشكل صريح (بدلاً من مطالبة النموذج بالوصول إليه مباشرة) أثناء تعيين حالة الاستعلام الخاصة بك لاستخدام قيمة الجلسة في كل مرة تكون فيها السجلات من النموذج تم استرجاعها ما لم تشارك بالفعل حالة تركز على المستخدم.

إنه ليس مناسبًا تمامًا لما تتبعه ، لكن لا ينبغي أن يستغرق الأمر وقتًا طويلاً لتكييف احتياجاتك.

حاول استخدام BindModel من AppControllers قبل Filter.

...
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
                        ...
                    ),
                    ...
                ),
                ...
            ),
        );
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top