Cakephp hasMany возвращает пустую связанную таблицу - PullRequest
0 голосов
/ 19 мая 2019

У меня есть две простые таблицы «Customer» и «SalesChannels», но данные возвращают только данные клиента, каналы продаж пусты, но с опцией HasOne все работает отлично без каких-либо дополнительных модификаций.

Вот их структура:

CREATE TABLE `sales_channels` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `customer` int(11) NOT NULL,
  `channel` varchar(45) DEFAULT NULL
  PRIMARY KEY (`Id`,`customer`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `customer` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

и их таблица классов:

class SalesChannelsTable extends Table
{
    public function initialize(array $config)
    {
        $this->setPrimaryKey(['id', 'customer']);
        $this->setTable('sales_channels');
        $this->setEntityClass('App\Model\Entity\SalesChannels');

    $this->belongsTo('Customer')->setForeignKey('customer');
    }
}


class CustomerTable extends Table
{
    public function initialize(array $config)
    {
        $this->setPrimaryKey('id');
        $this->setTable('customer');
        $this->setEntityClass('App\Model\Entity\Customer');
        $this->hasMany('SalesChannels',[
            'foreignKey'=>'customer',
            'bindingKey'=>'id',
            'propertyName'=>'channels'
        ]);
    }
}

И Php код:

$customer = TableRegistry::get('Customer');
$customerEntity = $customer->find()->contain([
    'SalesChannels'
]);
echo $customerEntity->sql();
foreach($customerEntity as $e){
    debug($e);
}

Но результат не содержал содержимое каналов продаж, вот что он напечатал:

SELECT Customer.Id AS `Customer__Id`, Customer.username AS `Customer__username` FROM customer Customer


object(App\Model\Entity\Customer) {

    'Id' => (int) 1,
    'username' => 'test customer 1',
    'channels' => [],
    '[new]' => false,
    '[accessible]' => [
        '*' => true
    ],
    '[dirty]' => [],
    '[original]' => [],
    '[virtual]' => [],
    '[errors]' => [],
    '[invalid]' => [],
    '[repository]' => 'Customer'

}

object(App\Model\Entity\Customer) {

    'Id' => (int) 2,
    'username' => 'test customer 2',
    'channels' => [],
    '[new]' => false,
    '[accessible]' => [
        '*' => true
    ],
    '[dirty]' => [],
    '[original]' => [],
    '[virtual]' => [],
    '[errors]' => [],
    '[invalid]' => [],
    '[repository]' => 'Customer'

}

но с опцией HasOne все работает отлично без каких-либо дополнительных модификаций.

1 Ответ

0 голосов
/ 20 мая 2019

Я нашел решение, я должен сохранить имя таблицы в seTable и bindingKey в hasMany не то же самое, что и в его первой букве, это означает, что если 'customer' в нижнем регистре, то 'id' должен записываться как 'Id', или если ' Клиент 'тогда bindingKey должен быть' ID ', это очень странно

Так что это не будет работать:

        $this->setTable('customer');
        $this->hasMany('SalesChannels',[
            'foreignKey'=>'customer',
            'bindingKey'=>'id',
            'propertyName'=>'channels'
        ]);

Я должен написать:

        $this->setTable('customer');
        $this->hasMany('SalesChannels',[
            'foreignKey'=>'customer',
            'bindingKey'=>'Id',
            'propertyName'=>'channels'
        ]);

или

        $this->setTable('Customer');
        $this->hasMany('SalesChannels',[
            'foreignKey'=>'customer',
            'bindingKey'=>'id',
            'propertyName'=>'channels'
        ]);

Может кто-нибудь сказать мне, как это случилось? Я никогда не думал, что это будет чувствительно к регистру ... это не имеет смысла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...