cakephp 如何查询与特定连接表条目关联的数据?

hjqgdpho  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(130)

我有2个表与之有许多关系:UsersTests,以及使用bake生成的关联TestsUsers的连接表。
TestsUsers中,我有2个额外的字段(除了user_idtest_id之外),名称为scoredate。首次添加记录时,我在TestsController中手工创建了实体(创建一个$test实体,添加test.iduser.iduser._joinData),并使用link()保存数据。
我在检索要编辑的记录时遇到了麻烦。到目前为止,在索引视图(显示所有记录并具有编辑和删除操作)中,我向编辑函数传递了3个参数:第一个元素是test_id,第二个元素是user_id和第三个元素是TestsUsers_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。
P.S. =我不被允许加载或使用TestsUsers模型。谢谢

apeeds0o

apeeds0o1#

根据您在注解中的解释,连接表行的存在会影响是否检索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();

另请参阅

*Cookbook〉数据库访问和ORM〉查询生成器〉按关联数据筛选


相关问题