CakePHP: найти связанные данные с содержанием - PullRequest
0 голосов
/ 17 мая 2019

Я читаю документацию по CakePHP, но я не уверен, нужно ли мне использовать какие-то другие методы, кроме find.Пример:

в моем контроллере я хочу предоставить отфильтрованный список Orders, где поле state связанной таблицы OrderStates равно «Открыто»:

$orders = $this->ItemsDeliveryNotes->Orders->find('list', [
    'limit' => 200, 
    'conditions' => ['Orders.order_state.state' => 'Open'],
    'contain' => ['OrderStates']
]);

, но говорит, что не находит столбец order_state.Здесь определение таблицы Orders:

Сотворение

CREATE TABLE orders (
    id int(11) NOT NULL AUTO_INCREMENT,
    customer_id int(11),
    orderNumber varchar(255) NOT NULL,
    orderDate date,
    order_state_id int(11),
    PRIMARY KEY (id),
    KEY order_state_id (order_state_id),
    CONSTRAINT orders_ibfk_1 FOREIGN KEY (customer_id) REFERENCES customers (id) ON DELETE NO ACTION ON UPDATE NO ACTION,
    CONSTRAINT orders_ibfk_2 FOREIGN KEY (order_state_id) REFERENCES order_states (id) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Сущность

class Order extends Entity
{
    protected $_accessible = [
        'orderNumber' => true,
        'orderDate' => true,
        'customer_id' => true,
        'order_state_id' => true,
        'customer' => true,
        'order_state' => true,
        'items' => true
    ];
}

Таблица

public function initialize(array $config)
{
    parent::initialize($config);

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

    $this->belongsTo('Customers', [
        'foreignKey' => 'customer_id'
    ]);
    $this->belongsTo('OrderStates', [
        'foreignKey' => 'order_state_id'
    ]);
    $this->hasMany('Items', [
        'foreignKey' => 'order_id'
    ]);
}

public function buildRules(RulesChecker $rules)
{
    $rules->add($rules->existsIn(['order_state_id'], 'OrderStates'));
    $rules->add($rules->existsIn(['customer_id'], 'Customers'));

    return $rules;
}

и OrderStates:

Создание

CREATE TABLE order_states (
 id int(11) NOT NULL AUTO_INCREMENT,
 state varchar(255) NOT NULL,
 badge varchar(255) DEFAULT NULL,
 PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

Сущность

class OrderState extends Entity
{
    protected $_accessible = [
        'state' => true,
        'badge' => true
    ];
}

Таблица

public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('order_states');
    $this->setDisplayField('state');
    $this->setPrimaryKey('id');
}

Столбец order_state доступен в Orders и ятакже добавил связанную таблицу (OrderStates) к опции contain.Что я до сих пор скучаю?

Ответы [ 2 ]

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

Вот рабочий синтаксис для использования:

$orders = $this->ItemsDeliveryNotes->Orders->find('list', [ 'limit' => 200 ])
    ->contain('OrderStates')->where(['state' => 'Open']);
0 голосов
/ 17 мая 2019

@ отметьте проблему в ваших условиях для содержания сущности. Пожалуйста, подтвердите, какую версию CakePHP вы используете.

Вот пример использования условий для contained table

Условия прохождения для содержания

// Prior to 3.5.0 you would use contain(['Comments' => function () { ... }])

$query = $articles->find()->contain('Comments', function (Query $q) {
    return $q
        ->select(['body', 'author_id'])
        ->where(['Comments.approved' => true]);
});

Примечание : убедитесь, что вы включили use Cake\ORM\Query; в раздел пространств имен.

Для получения более подробной информации вы можете обратиться к документации здесь. https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#passing-conditions-to-contain

В вашей ситуации это может быть что-то вроде этого.

$orders = $this->ItemsDeliveryNotes->Orders->find('list', [ 'limit' => 200 ])->contain('OrderStates', function (Query $q) { return $q->where(['state' => 'Open']); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...