左边加入CakePHP3

时间:2017-06-20 15:51:21

标签: sql cakephp join associations cakephp-3.0

我正在尝试在CakePHP3中进行LEFT JOIN。 但我得到的只是“没有关联”-Error。

我有两张桌子BORROWERS和IDENTITIES。 在SQL中,这就是我想要的:

var app = angular.module('app', ['ui.grid', 'ui.grid.edit']);

app.controller('MainController', function($scope) {
    $scope.gridOptions = {
        columnDefs: [{
            name: 'startDate',
            editableCellTemplate: '<input datepicker ng-model="MODEL_COL_FIELD" readonly>',
            enableCellEdit: true,
            width: 150
        }],
        data: [{
            startDate: ''
        }]
    };
});

app.directive('datepicker', ['uiGridEditConstants', function(uiGridEditConstants) {
    return {
        restrict: 'A',
        require: 'ngModel',
        compile: function() {
            return {
                pre: function($scope, $elm, $attrs) {},
                post: function($scope, $elm, $attrs) {
                    function setValueToScope(value) {
                        eval('$scope.' + $attrs.ngModel + ' = "' + value + '";');
                        $scope.$apply();
                    }
                    $elm = $($elm);
                    $elm.datepicker({
                        dateFormat: 'mm/dd/yy',
                        onSelect: function(date) {
                            setValueToScope(date);
                        },
                        onClose: function() {
                            $scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);
                        }
                    });
                    $elm[0].focus();
                }
            };
        }
    };
}]);

我想这就是我需要的:

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']);
        });

我还需要什么? 感谢名单!

2 个答案:

答案 0 :(得分:0)

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

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

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

请注意大小写和单数/复数通用命名约定,您的示例至少不会遵循这些约定 - 忽略这些约定会让您很难调试错误。

答案 1 :(得分:0)

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

此查询现在可以完美运行:

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