【问题标题】:Updating related row in another table cakephp 3更新另一个表 cakephp 3 中的相关行
【发布时间】:2016-09-23 12:15:37
【问题描述】:

在当前表中保存数据后,我正在尝试更新关联表中的一行。假设我有两个表,列表和队列。队列有一个外键listing_id。所以我已经成功保存了一个新的队列,其中当然也包含了一个listing的id,怎么还能更新Listings表上Listing的状态字段,比如从“暂停”到“排队”?

看看我的代码是什么样子的

$queue = $this->Queues->newEntity();
$queue->listing_id = $this->request->data['id'];
$queue->user_id = $this->Auth->user('id');

if ($this->Queues->save($queue)) {      

    $this->response->body("success");

    $this->redirect(array('controller'=>'ListingsController','action' => 'changeStatus', $this->request->data['id'], "queued"));

}   

协会

列表表格

    $this->table('listings');
    $this->displayField('name');
    $this->primaryKey('id');

    $this->addBehavior('Timestamp');

    $this->belongsTo('Users', [
        'foreignKey' => 'user_id',
        'joinType' => 'INNER'
    ]);

排队表

    $this->table('queues');
    $this->displayField('id');
    $this->primaryKey('id');

    $this->belongsTo('Listings', [
        'foreignKey' => 'listing_id',
        'joinType' => 'INNER'
    ]);
    $this->belongsTo('Users', [
        'foreignKey' => 'user_id',
        'joinType' => 'INNER'
    ]);

【问题讨论】:

  • 尝试从saving associated data上的文档开始。
  • 请先说明您的模型关联。您可以在创建 newEntity() 时简单地加载关联并保存两个模型数据。
  • 感谢您的回复。当我说我一遍又一遍地阅读该文档时,请相信我。就是想不通。我对框架有点陌生,我知道它最终会成为我所缺少的简单东西。请问您所说的模型关联是什么意思,让我用我认为您的意思来更新问题。谢谢
  • $queues 对象是什么样的?如果构建正确,cake 会自动负责更新关联。
  • Queues 表只有 3 个字段:id、user_id、listing_id

标签: php cakephp relationship cakephp-3.0


【解决方案1】:

这成功了:$this->loadModel('Listings');

然后从那里我可以使用查询中的 WHERE 子句对 Listings 对象执行 ->newEntity()、->patchEntity() 和/或 ->save(),就像在 Listings 控制器中一样。

例如:

$this->loadModel('Listings');
$listing = $this->Listings->get($id);
$listing->status = "completed";
$this->Listings->save($listing);

很简单。

【讨论】:

  • 这听起来比它应该需要的要复杂得多且容易出错。
  • l0l,我实际上并不具体。第一行的陈述实际上是我所缺少的。这就是你在 cakephp3 中加载和使用其他模型的模型的方式
  • 编辑了我的答案以说明我的意思
  • 虽然这可以正常工作,但还有其他理论上更好的方法可以做到这一点。例如,您可以在$queue 对象中包含更新的列表信息,然后保存它也会更新列表记录。这就是@drmonkeyninja 和@tolga 的目的。另一种选择是创建一个事件侦听器,该侦听器在保存队列时触发,并根据需要更新列表。这更复杂,但如果代码中有多个需要保存队列的位置可能会更好,因为列表更新代码只在一个位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多