当前位置: 首页 > 知识库问答 >
问题:

CakePHP 3:没有保存/创建一个关联

张和豫
2023-03-14

Cake-PHP版本:3.1。5

我在保存hasOne关联时遇到了一个问题,它在一张表上运行良好,但在第二张表上却不行。

票据现金汇票现金头寸之间有一种归属关系。现金头寸为其id保留两个FK。因此,当自动创建新的现金头寸时,它会保留票据id现金汇票id。第二个FK将为空。

问题是,Tickets Cashpositions保存工作正常,因此每次创建一张ticket时,都会创建一个相关的cashposition。但它不适用于现金头寸。我不明白为什么,因为设置和关系完全相同。

这里是设置:

class CashpositionsTable extends Table
{
    public function initialize(array $config)
    {
        $this->belongsTo('Tickets', [
           'foreignKey' => 'ticket_id'
        ]);
        $this->belongsTo('Cashdrafts', [
           'foreignKey' => 'cashdraft_id'
        ]);
    }
}
class TicketsTable extends Table
{
    public function initialize(array $config)
    {
        $this->hasOne('Cashpositions', [
            'foreignKey' => 'ticket_id'
        ]);
    }
}
class CashdraftsTable extends Table
{
    public function initialize(array $config)
    {
        $this->hasOne('Cashpositions', [
            'foreignKey' => 'cashdraft_id'
        ]);
    }
}

然后在控制器中添加()函数:

class TicketsController extends AppController
{
    public function add($memberId = null)
   {
      $ticket = $this->Tickets->newEntity();
      if ($this->request->is('post')) {

        $ticket = $this->Tickets->patchEntity($ticket, $this->request->data, [
           // working fine: creates new cashposition for this ticket
            'associated' => ['Cashpositions']
        ]);

        if ($this->Tickets->save($ticket)) {
            $this->Flash->success(__('ticket saved'));
            return $this->redirect(['action' => 'view', $ticket->$id]);
        } else {
            $this->Flash->error(__('ticket could not be saved'));
        }
    } 
class CashdraftsController extends AppController
{
    public function add()
    {
    $cashdraft = $this->Cashdrafts->newEntity();
    if ($this->request->is('post')) {

        $cashdraft = $this->Cashdrafts->patchEntity($cashdraft, $this->request->data,[
          // fail: no associated record created
         'associated' => ['Cashpositions']
      ]);

     if ($this->Cashdrafts->save($cashdraft)) {            
            $this->Flash->success(__('cashdraft saved.'));
            return $this->redirect(['action' => 'view', $cashdraft->id]);
     } else {
            $this->Flash->error(__('cashdraft could not be saved'));
        }
    }
}

我调试了$ticket和$cashfraft。但我不能说我理解输出,因为:

票证数组将显示所有相关数据,但不显示现金头寸,尽管已成功为其创建新记录。。。

未创建相关cashposition的新cashdraft的数组将如下所示,并为其显示“null”:

object(App\Model\Entity\Cashdraft) {

'id' => (int) 10,
'amount' => (float) -7,
'created' => object(Cake\I18n\Time) {

    'time' => '2015-12-13T20:03:54+0000',
    'timezone' => 'UTC',
    'fixedNowTime' => false

},
'modified' => object(Cake\I18n\Time) {

    'time' => '2015-12-13T20:03:54+0000',
    'timezone' => 'UTC',
    'fixedNowTime' => false

},
'cashposition' => null,  // this part not even showing up for a "ticket" in the debug
'[new]' => false,
'[accessible]' => [
    '*' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Cashdrafts'

}

在SQLinDebugKit中,我可以看到,对于票据,插入到相关的cashpositions表中的操作已经完成。但对于现金汇票,没有插入到相关表中。显然,Cake甚至没有尝试创建相关记录。

我现在真的没有主意了!在数据库本身中,两个FK的设置完全相同,名称正确等。

有没有人知道问题出在哪里,或者我可以在哪里进一步寻找第二个协会不起作用的原因?谢谢

共有1个答案

景令秋
2023-03-14

好吧,在搜索了一百万个小时后,我终于意识到问题不在我想的模型或控制器上。只是视图和请求数据不完整。不知何故,我认为Cake会神奇地为该关联添加实体(如果该实体不存在,即使它没有输入;)

在保存有效的tickets表中,Cashpositions中的一列有一个空的输入字段,它甚至不再存在,我只是还没有删除它,但它成功了(不要问我为什么)。

为了解决这个问题,现在我只是在add.ctp视图中为两个表的关联cashposition.ticket_idcashposition.cashdraft_id添加了一个隐藏的输入字段。现在,请求数据包含关联的数组,并且每当添加新的票证或现金汇票时,自动创建具有匹配FK的新现金头寸。

<!-- Cashdrafts/add.ctp -->

<?php echo $this->Form->input(
        'cashposition.cashdraft_id', [
                'label' => false,
                'type' => 'hidden'
        ]) ?>

因为我只是一个初学者,我不知道这是不是最好的方式去,但它的作品(最后...)

 类似资料:
  • 我创建了一个自定义的推送()方法,它以级联的方式保存所有模型的关系,并收集实体和子实体详细信息的完整快照用于审计日志。 一切都与belongsTo配合良好,并且有很多关系。我只是这样做: 但问题在于他只有一种关系。它不提供任何方法将相关模型附加到我的根模型而不首先保存它。HasOne关系在Laravel中只有save()方法: 如您所见,它不仅关联,而且保存了模型。为了能够检测字段的所有更改,我的

  • 本文向大家介绍Python3中关于cookie的创建与保存,包括了Python3中关于cookie的创建与保存的使用技巧和注意事项,需要的朋友参考一下 1.cookie的作用 cookie 是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据,就像有些网站上的一些数据是需要登录后才能看得到,那么想抓取某个页面内容,就需要用到cookie来模拟登陆了。 在用cookie模

  • 问题内容: 我将Spring和Hibernate用作JPA提供程序,并尝试获取@OneToMany(具有许多电话号码的联系人)以将外键保存在电话号码表中。从我的表单中,我得到一个Contact对象,其中有一个Phone(数字)列表。Contact可以正确持久保存(Hibernate从指定序列中获取PK)。电话(号码)列表也将保留正确的PK,但“联系人”表中没有FK。 希望我掌握了以上所有相关内容,

  • 我有一个默认的redis缓存配置在我的application.yml: 它工作得很好,我不想为它创建任何自定义缓存管理器。 然而,在我的代码中有一些缓存不需要使用redis。因此,我想制作第二个CacheManager,它是一个简单的ConcurrentHashMap,并用@Cacheable指定它 为此,我创建了一个新的CacheManager Bean: 这将导致inMemoryCache成为

  • 我想使用SpringDataRepository接口来执行本机查询——我认为这种方式最简单,因为复杂性较低。 但是当扩展接口时。

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 我的目标是创建一个脚本,例如每10分钟发布一个帖子,并且所有要发布的图片都将提前提供给脚本。我不知道从哪里开始,必须使用哪种语言来完成,或者是否有可能这样做(编程的新手)。