【问题标题】:Join query retrieving data from only one table cakephp 3加入查询仅从一张表中检索数据 cakephp 3
【发布时间】:2023-03-03 16:31:01
【问题描述】:

我是 cakephp 新手。我正在使用查询生成器使用 cakephp 查询生成器中的连接从两个表中获取详细信息。但是我正在编写的查询仅从一个表中获取详细信息。也需要帮助才能从其他表中获取数据。

这是我通过连接两个表来获取数据的代码:

public function edit($id = null) {

    $events_table = TableRegistry::get('Events');

    $events = $events_table->find('all') 
            ->hydrate(false)
            ->join([
            'CourseType'=>  [
                        'table'      => 'coursetype',
                        'type'       => 'LEFT',
                        'conditions' => 'Events.type = CourseType.coursetype_id',
                    ]                   
            ])->where(['Events.id' => $id]);

     $event = $events->toArray();       
     $this->set('event', $event);
}

因此,我只能从事件表中获取详细信息。但我也需要来自 coursetype 的数据。感谢任何帮助。谢谢。

【问题讨论】:

标签: php mysql cakephp cakephp-3.4


【解决方案1】:

手动添加联接不会导致选择任何其他数据,您必须自己通过select() 方法指定要选择的字段来执行此操作。

$events = $events_table
    ->find('all') 
    ->hydrate(false)
    ->select($events_table)
    // either add the fields one by one, or pass a table object
    // as above to select all fields of the table
    ->select(['CourseType.id', 'CourseType.xyz', /* ... */])
    // ...

我建议改用使用容器,即设置所需的关联(如果尚未存在),然后简单地使用contain()

$events = $events_table
    ->find('all') 
    ->hydrate(false)
    ->contain('CourseType')
    ->where(['Events.id' => $id]);

另见

【讨论】:

  • CourseType 型号名称?
  • 这取决于您的设置,我只是使用了与您在示例中相同的别名。如果您遵循 CakePHP 的 naming conventions,那么“模型”(表类)名称将是 Coursetype,如果您也遵循数据库表名称的约定,那么它将是 course_types,型号名称为CourseTypes。 @VaruniNR
  • 好的,谢谢。会试一试
  • 使用包含我可以使用加入吗?
  • 不,您使用contain() 而不是join()。 @VaruniNR
【解决方案2】:

您的解决方案在这里:CakePHP find method with JOIN

【讨论】:

  • 我认为这是 cakephp 2.x。您可以发送 cakephp 3.x 的答案吗?