我正在阅读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
选项中。我仍然想念什么?
在这里使用的语法要使用:
$orders = $this->ItemsDeliveryNotes->Orders->find('list', [ 'limit' => 200 ])
->contain('OrderStates')->where(['state' => 'Open']);
@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]);
});
NOTE :确保已在名称空间部分中包含use CakeORMQuery;
。
对于更多的厌恶,您可以在此处参考文档。https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#pass-conditions-conditions-to-contain
对于您的情况,可能是这样的。
$orders = $this->ItemsDeliveryNotes->Orders->find('list', [ 'limit' => 200 ])->contain('OrderStates', function (Query $q) { return $q->where(['state' => 'Open']); });