【问题标题】:Deep joins Cakephp深度加入 Cakephp
【发布时间】:2017-07-25 09:47:54
【问题描述】:

我在使用 find() 方法和在 cakephp 2 中深度连接时遇到问题。

我正在构建一个 search() 函数,它应该在 3 个模型中搜索:联系人、建筑物和城市,其中联系人包含包含城市的建筑物。

这是我的要求:

$options['contain'] = array(
                'User' => array(
                    'fields' => array('id', 'first_name', 'last_name')
                ),
                'Building' => array(
                    'City' => array(
                        'fields' => array('name')
                    ),
                    'fields' => array('id', 'title')
                )
        );

        $options['conditions']['OR'] = array(
            array('Contact.id LIKE' => '%'.$search.'%'),
            array('User.first_name LIKE' => '%'.$search.'%'),
            array('User.last_name LIKE' => '%'.$search.'%'),
            array('Building.title LIKE' => '%'.$search.'%'),
            array('Building.City.name LIKE' => '%'.$search.'%'),
        );

        $contacts = $this->Contact->find('all', $options);

但这会产生以下WHERE 条件:

WHERE `Contact`.`white_label_id` = 18 AND ((`User`.`first_name` LIKE '%jean%') OR (`User`.`last_name` LIKE '%jean%') OR (`Building`.`title` LIKE '%jean%') OR (`Building`.`City`.`name` LIKE '%jean%'))

问题出在城市模型上,我无法在名称字段中进行搜索。有人可以帮我吗?

【问题讨论】:

  • 如果我错了请纠正我,是array('Building.City.name LIKE' => '%'.$search.'%'), 还是array('City.name LIKE' => '%'.$search.'%'),
  • @KevinKyaw 这不起作用......在这两种情况下,我都会收到相同的消息“找不到列:1054 未知列 City.name / Building.City.name”
  • 看来你需要加入城市模型
  • 你认为 BindModel 合适吗?
  • 这取决于你的逻辑。如果你不想要,你可以轻松加入。

标签: php mysql cakephp


【解决方案1】:

我得到与绑定模型相同的结果“未找到列:1054 未知列 City.name 在 where 子句中”:

$this->Contact->bindModel(array(
            'hasOne' => array(
                'City' => array(
                    'foreignKey' => false,
                    'conditions' => array('City.id = Contact.Building.city_id')
                )
            )
        ));

        $options['contain'] = array(
            'User' => array(
                'fields' => array('id', 'first_name', 'last_name'),
            ),
            'Building' => array(
                'City' => array(
                    'fields' => array('name'),
                ),
                'fields' => array('id', 'title')
            )
        );

        $options['conditions']['OR'] = array(
            array('Contact.id LIKE' => '%'.$search.'%'),
            array('User.first_name LIKE' => '%'.$search.'%'),
            array('User.last_name LIKE' => '%'.$search.'%'),
            array('Building.title LIKE' => '%'.$search.'%'),
            array('City.name LIKE' => '%'.$search.'%')
        );

        $contacts = $this->Contact->find('all', $options);

我在 sql 查询中的 WHERE 子句:

WHERE `Contact`.`white_label_id` = 33 AND ((`Contact`.`id` LIKE '%fouillard%') OR (`User`.`first_name` LIKE '%fouillard%') OR (`User`.`last_name` LIKE '%fouillard%') OR (`Building`.`title` LIKE '%fouillard%') OR (`City`.`name` LIKE '%fouillard%'))

我搞砸了 bindModel 吗?

【讨论】:

    【解决方案2】:

    对于bindModel应该是这样的。

    $this->Contact->bindModel(
          array('hasOne' => array('City' => array('className' => 'Contact'))));
    

    可以加入这样的事情吗?

     'joins' => [
          [
              'table' => 'city',
              'alias' => 'City',
              'type' => 'INNER',
              'conditions' => [
                 'Contact.city_id = City.id'
               ]
          ]
      ],
    

    【讨论】:

    • 我仍然使用这种形式的 bindModel 得到相同的结果。这是错的吗? $options['conditions']['OR'] = array(array('Contact.id LIKE' => '%'.$search.'%'), array('User.first_name LIKE' => '%' .$search.'%'), array('User.last_name LIKE' => '%'.$search.'%'), array('Building.title LIKE' => '%'.$search.'% '), array('City.name LIKE' => '%'.$search.'%') );
    • 您的合同和城市模型中是否有 hasone 或 hasMany ?
    • 是的,联系人有另一个 hasOne 和 0 hasMany。市有2个有很多。这对 bindModel 有影响吗?
    • 你能加入而不是 bindModel 吗?如果可以,请再次检查。
    • 是的,我可以,但是如果我加入的话,我可以在 City.name 上搜索吗(我已经有了用户、联系人和建筑模型的条件)?
    【解决方案3】:

    我回来找你是因为我终于找到了解决方案,它是搜索功能中使用的每个模型的连接:

                $options['contain'] = array(
                'User' => array(
                    'fields' => array('id', 'first_name', 'last_name'),
                ),
                'Manager' => array(
                    'fields' => array('id', 'first_name', 'last_name', 'email', 'phone'),
                ),
                'Building' => array(
                    'City' => array(
                        'fields' => array('name', 'id'),
                    ),
                    'fields' => array('id', 'title')
                ),
                'Step',
            );
    
            $options['joins'] = array(
                array(
                    'table' => 'cities',
                    'alias' => 'City',
                    'type' => 'INNER',
                    'conditions' => [
                        'Building.city_id = City.id'
                    ]
                ),
            );
    
            $options['conditions']['OR'] = array(
                array('Contact.id LIKE' => '%'.$search.'%'),
                array('User.first_name LIKE' => '%'.$search.'%'),
                array('User.last_name LIKE' => '%'.$search.'%'),
                array('Building.title LIKE' => '%'.$search.'%'),
                array('City.name LIKE' => '%'.$search.'%')
            );
    
            $contacts = $this->Contact->find('all', $options);
    

    感谢所有帮助过我的人。我希望这会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多