【问题标题】:Left Join CakePHP3左加入 CakePHP3
【发布时间】:2017-06-20 15:51:20
【问题描述】:

我正在尝试在 CakePHP3 中进行 LEFT JOIN。 但我得到的只是“未关联”-错误。

我有两个表 BORROWERS 和 IDENTITIES。 在 SQL 中,这就是我想要的:

SELECT
 identities.id
FROM
 identities
LEFT JOIN borrowers ON borrowers.id = identities.id
WHERE
 borrowers.id IS NULL;

我想这就是我需要的:

$var = $identities->find()->select(['identities.id'])->leftJoinWith('Borrowers',
        function ($q) {
               return $q->where(['borrowers.id' => 'identities.id']);
        });

但我收到“身份与借款人无关”。

我也将此添加到我的身份表中:

$this->belongsTo('Borrowers', [
  'foreignKey' => 'id'
]);

我还需要什么? 谢谢!

【问题讨论】:

  • $identities 可能不是你想象的那样,例如它是一个自动表,它是\Cake\ORM\Table 的一个实例,而不是它的具体子类。检查get_class($identities)stackoverflow.com/a/43143901/1392379

标签: sql cakephp join associations cakephp-3.0


【解决方案1】:

外键不能只是“id”,这不是正确的模型关联。您需要在身份中放置一个“borrower_id”字段,并在身份模型中像这样声明它:

class Identities extends AppModel {
     var $name = 'Identities';

public $belongsTo = array(
     'Borrower' => array (
          'className' =>  'Borrower',
          'foreignKey' => 'borrower_id'
           )
      );

请注意您的示例至少没有遵循的大写和单数/复数通用命名约定 - 忽略这些会让您遇到一些非常难以调试的错误。..

【讨论】:

    【解决方案2】:

    是的。它是\Cake\ORM\Table 的一个实例,因为我没有很好地选择表名(Identity/Identities)。我想最好不要选择那些障碍,现在我将其重命名为标签/标签。

    这个查询现在可以完美运行:

    $var = $identities 
      ->find('list')
      ->select(['labels.id'])
      ->from('labels')
      ->leftJoinWith('Borrowers')
      ->where(function ($q) {
          return $q->isNull('borrowers.id'); 
    });
    

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2019-07-07
      • 2017-08-28
      • 2014-02-11
      相关资源
      最近更新 更多