0

我正在阅读 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选项中。我还想念什么?

4

2 回答 2

0

这里使用的工作语法:

$orders = $this->ItemsDeliveryNotes->Orders->find('list', [ 'limit' => 200 ])
    ->contain('OrderStates')->where(['state' => 'Open']);
于 2019-05-17T09:28:59.073 回答
-1

在包含实体的条件中@mark 问题。请确认您使用的是哪个 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']); });
于 2019-05-17T09:08:51.810 回答