如何使用Cakephp进行查询连接?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (50)

我有一个评论表,用户可以在其中评论另一个用户:

这些都是限制因素:

当我使用此查询时:

$comments = TableRegistry::getTableLocator()
            ->get('Comments')
            ->find('all');
 $query = $comments
          ->find('all')
          ->contain(['Users']);

它检索注释,但它仅 commented_id 应用连接。虽然我想检索包含其两个相关用户的评论对象一个作为评论员,另一个作为评论者; 那么如何构建查询呢?

这是评论表:

class CommentsTable extends Table
{
    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('comments');
    $this->setDisplayField('id');
    $this->setPrimaryKey('id');

    $this->belongsTo('Users', [
        'foreignKey' => 'commentator_id',
        'joinType' => 'INNER'
    ]);
    $this->belongsTo('Users', [
        'foreignKey' => 'commented_id',
        'joinType' => 'INNER'
    ]);
}

/**
 * Default validation rules.
 *
 * @param \Cake\Validation\Validator $validator Validator instance.
 * @return \Cake\Validation\Validator
 */
public function validationDefault(Validator $validator)
{
    $validator
        ->integer('id')
        ->allowEmpty('id', 'create');

    $validator
        ->scalar('content')
        ->maxLength('content', 255)
        ->requirePresence('content', 'create')
        ->notEmpty('content');

    $validator
        ->integer('score')
        ->requirePresence('score', 'create')
        ->notEmpty('score');

    $validator
        ->dateTime('created_at')
        ->requirePresence('created_at', 'create')
        ->notEmpty('created_at');

    $validator
        ->dateTime('updated_at')
        ->requirePresence('updated_at', 'create')
        ->notEmpty('updated_at');

    return $validator;
}

/**
 * Returns a rules checker object that will be used for validating
 * application integrity.
 *
 * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
 * @return \Cake\ORM\RulesChecker
 */
public function buildRules(RulesChecker $rules)
{
    $rules->add($rules->existsIn(['commentator_id'], 'Users'));
    $rules->add($rules->existsIn(['commented_id'], 'Users'));

    return $rules;
}

}

提问于
用户回答回答于

我不确定你输出的是什么,但根据我的理解,你可以使用自定义连接:

$data = $this->Comments->find()
                        ->join([
                          'Users' => [
                                          'table' => 'users',
                                          'type' => 'INNER',
                                          'conditions' => [
                                              'Users.id=Comments.commentator_id',
                                           'OR' => [
                                                'Users.id=Comments.commented_id'
                                                   ]
                                            ] 
                                     ]
                              ]);

或者你可以根据需要修改它。

所属标签

可能回答问题的人

  • 爸爸

    腾讯 · 客户端安全 (已认证)

    4 粉丝4 提问5 回答
  • 找虫虫

    0 粉丝0 提问5 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问4 回答
  • uncle_light

    5 粉丝518 提问4 回答

扫码关注云+社区

领取腾讯云代金券