【问题标题】:CakePHP: find associated data with containCakePHP:使用包含查找关联数据
【发布时间】:2019-05-17 08:57:52
【问题描述】:

我正在阅读 CakePHP 文档,但我不确定是否需要使用 find 以外的其他方法。示例:

在我的控制器中,我想提供Orders 的过滤列表,其中相关表OrderStatesstate 字段为“打开”:

$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 选项。我还想念什么?

【问题讨论】:

    标签: mysql cakephp


    【解决方案1】:

    这里使用的有效语法:

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

    【讨论】:

      【解决方案2】:

      @标记包含实体的条件中的问题。请确认您使用的是哪个 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']); });
      

      【讨论】:

      • 我使用的是 CakePHP 3.7.7
      • @Mark 在这种情况下,上面的例子可以帮助你。
      • $orders = $this->ItemsDeliveryNotes->Orders->find('list', [ 'limit' => 200 ])->contain('OrderStates', function (Query $q) { return $q->where(['state' => 'Open']); });
      • 它返回:“传递给 App\Controller\ItemsDeliveryNotesController::App\Controller\{closure}() 的参数 1 必须是 App\Controller\Query 的实例,Cake\ORM\Query 的实例给定,在 /home/mark/erp/vendor/cakephp/cakephp/src/ORM/Association.php 中调用。也许还有其他需要设置的东西?
      • 不应该。它将在 Orders 范围内运行,因为您将使用 Order Model 进行查询......而不是在它的 chield / contains 上。对于包含的对象,您必须将条件指定为更接近的函数。 book.cakephp.org/3.0/en/orm/…
      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多