首页 > 解决方案 > 未使用 find() 选项连接的表

问题描述

我正在尝试在控制器中加入以下两个表:

artifacts_publications
----------------------
id
artifact_id
publication_id

authors_publications
--------------------
id 
author_id
publication_id

其他具有像 belongsTo 和 HasMany 等关联的表可以使用contain(). 对于这些表,假设尚未定义关联。最后,我想将另一个表加入这些表的连接,但现在我无法让这两个加入。

控制器使用

    namespace App\Controller;
    use App\Controller\AppController;
    use Cake\ORM\TableRegistry;
    use Cake\Datasource\ConnectionManager;

index()控制器的动作中,我有

$options['joins'] = [
    [
        'table' => 'authors_publications',
        'alias' => 'j',
        'type' => 'LEFT OUTER',
        'conditions' => [
            'authors_publications.publication_id = artifacts_publications.publication_id',
        ],
    ],
];

$query = TableRegistry::getTableLocator()->get('artifacts_publications')->find('all', $options);
$query->limit(2);

debug($query);
debug($query->toArray());

生成的 SQL 查询有点像这样,但我缩短了长标识符:

SELECT id, artifact_id, publication_id 
FROM artifacts_publications
LIMIT 2;

执行该查询也显示没有连接。我尝试关注cakePHP 表加入两个表的问题,但我仍然无法加入。手写 SQL 有效,但并不优雅。我在这里想念什么?

标签: cakephpcakephp-3.0

解决方案


@Utsav

尝试Containable通过将 'join' 切换为 'contain' 来使用 CakePHP 的行为。

$options = [
            'fields' => [
                'ArtifactsPublication.fieldsYouWant'
            ],
            'conditions' => [
                'ArtifactsPublication.id' => $artifactId
            ],
            'contain' => [
                'AuthorsPublication'
            ]
        ];

您还可以设置递归来定义是否要获取包含模型的链接模型。或者,您可以在fields选项中指定您希望从artifacts_publications模型中获得哪些字段,然后只contain指定authors_publications模型。

希望这会有所帮助,因为我在 CakePHP 中手动加入的经验很糟糕,CakePHP 标准也是使用contain. 请注意,contain无法检索远程连接数据。

队友的欢呼声 :)


推荐阅读