【问题标题】:How to query data that is associated with a specific join table entry?如何查询与特定联接表条目关联的数据?
【发布时间】:2021-08-12 03:55:11
【问题描述】:

我有 2 个表,它们有很多关系:UsersTests,这是一个使用 bake 生成的连接表,它关联了 TestsUsers

TestsUsers 中,我有两个名为scoredate 的额外字段(除了user_idtest_id)。第一次添加记录时,我在TestsController 中手动制作实体(创建$test 实体,添加test.iduser.iduser._joinData)并使用link() 保存数据。

我无法检索该记录以进行编辑。到目前为止,在索引视图中(显示所有记录并具有编辑和删除操作),我将 3 个参数传递给编辑函数:test_iduser_idTestsUsers_id

我用过:

$this->Tests->get(($test_id), [
    'contain' => 'Users',
    function ($q) use ($user_id) {
        return $q->where(['Users.id' => $user_id])  
    }
]])

结果是:

test
    (test info)
    users
        [0]
           user_id=1
           (user info)
           _joinData
                   id=1
        [1]
           user_id=1
           (user info)
           _joinData
                    id=2

问题是,我如何访问get() 中的_joinData 级别以使用其ID。

附: = 我不允许加载或使用TestsUsers 模型。 谢谢

【问题讨论】:

  • “在get() 中访问_joinData 级别”是什么意思?在您从get 收到的数据中?或者你想以某种方式在你拨打 to get 的电话中使用它?
  • 嗨,对不起,英语不是我的第一语言,我要说的是我如何访问那个 _joinData,这样我就可以将那里的 id (testsUsers_id) 与要编辑的记录的 id 进行比较(testsUsers_id)。我给控制器 3 个参数,user_id、test_id 和 testsUsers_id(_joinData),或者如何在不使用 TestsUsers 表的情况下从这 3 个表中获取()或查找()与这些参数匹配的记录,我只设法只使用 2 个参数
  • 简而言之,我需要从连接表TestsUsers 中检索一条现有记录,使用用户的id、test 和testsUsers 作为参数。这将用于更新该记录
  • 啊,您想要返回类似于您的测试数据所显示的内容,但只有一个用户记录的_joinData 与指定的ID 匹配?我实际上不知道该怎么做,但希望通过澄清有人能够提供帮助。
  • 没错,谢谢

标签: cakephp associations cakephp-4.x


【解决方案1】:

根据您在 cmets 中的解释,连接表行的存在应该会影响是否正在检索 Tests,您通常需要加入您的关联表,并应用所需的条件来过滤您的结果。

此外,您还需要对contain() 应用相同的条件,因为这是一个单独的查询,不会影响除自身之外的任何内容,其结果随后将合并到 PHP 级别的Tests 结果中。

一个基本的例子:

$test = $this->Tests
    ->find()
    ->contain('Users', function (\Cake\ORM\Query $query) use ($user_id, $TestsUsers_id) {
        return $query
            ->where([
                'Users.id' => $user_id,
                'TestsUsers.id' => $TestsUsers_id,
            ]);
    })
    // This will join in the join table as well as the target table,
    // hence conditions for the former can be applied as well
    ->innerJoinWith('Users', function (\Cake\ORM\Query $query) use ($user_id, $TestsUsers_id) {
        return $query
            ->where([
                'Users.id' => $user_id,
                'TestsUsers.id' => $TestsUsers_id,
            ]);
    })
    ->where([
        'Tests.id' => $test_id,
    ])
    // Grouping is probably not required as the uniqueness of the join
    // table's primary key should already restrict things to one row
    ->group('Tests.id')
    ->firstOrFail();

另见

【讨论】:

  • 非常感谢,它运行良好。我没有针对TestsUsers 表,因为有人告诉我不推荐它,但对于这种特殊情况,它似乎是必要的。
  • 抱歉再次打扰,我编辑了连接表中的“额外字段”数据,并制作了patchEntity,以使用更新的数据修改查询实体。使用$this->Tests->save($test,['associated' => ['Users']])),它不保存记录,而是删除DDBB 中的每条记录,test_id 只留下最旧的记录。我只需要修改TestsUsers中的额外字段,而不是test_id也不是user_id
  • @JuanManuelGonzalezCarrascos 这是一个完全不同的问题,所以我建议您发布一个新问题,其中有详细解释的空间,显示您的关联设置,代码示例等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多