缺少表“Grupo” cakephp 的 FROM 子句条目

Posted

技术标签:

【中文标题】缺少表“Grupo” cakephp 的 FROM 子句条目【英文标题】:missing FROM-clause entry for table "Grupo" cakephp 【发布时间】:2014-04-22 20:55:06 【问题描述】:

嗨,我的代码有问题,我想生成一个用户列表,但这有一个组,只需要一组用户。 错误说:

错误:SQLSTATE[42P01]:未定义表:7 错误:缺少表“Grupo”的 FROM 子句条目

这是我的代码:

    public function add()

    $this->loadModel('SoyaProveedor');
    $this->loadModel('Soya');

    $this->set('oleaginosas', $this->Soya->find('list', array(
        'fields'=> array('id','username'),
        'conditions' => array('Grupo.categoria' => 'Soya' , 'Grupo.subcategoria' => 'Productor de Oleaginosas')
        )));

    if ($this->request->is('post')) 
    $this->request->data['SoyaProveedor']['nombre'] = strtoupper($this->request->data['SoyaProveedor']['nombre']);
    $this->request->data['SoyaProveedor']['codigo'] = strtoupper($this->request->data['SoyaProveedor']['codigo']);
    if ($this->SoyaProveedor->save($this->request->data)) 
        $this->Session->setFlash(__('La Información fue Guardada.'));
        return $this->redirect(array('action' => 'index'));
        
    

蛋糕的sql查询生成它:

SQL 查询:SELECT "Soya"."id" AS "Soya__id", "Soya"."username" AS "Soya__username" FROM "public"."users" AS "Soya" WHERE "Grupo"."categoria" = 'Soya' AND "Grupo"."subcategoria" = '生产者 de Oleaginosas'

【问题讨论】:

您的问题是您的条件在 Grupo 表上,而您在 Soya 上找到。 Soya和Grupo是什么关系? Soya 是用户,用户有组 请不要通过编辑来回答问题 - 写下答案并(在允许的情况下)接受它。也就是说 - 您找到了一个非常冗长/困难/不正常的解决方案(并且您再次加入用户表?)。 【参考方案1】:

您需要在查询中连接 grupos 表,您在问题中的查询没有连接。有许多简单的解决方案。

定义递归。

递归是对执行的连接和查询的非常粗略的控制,默认情况下find('list')has a recursive value of -1。

-1 表示没有连接,这就是结果查询中没有连接的原因。将其设置为值 0 会将连接添加到所有 hasOne 和 belongsTo 关联的主查询。

小心使用/依赖递归,因为它很容易生成带有您不需要的连接的查询 - 和/或触发许多后续对相关数据的查询(如果设置为大于 0 的值)。

但是这个 find 调用:

$data = $this->Soya->find('list', array(
    'fields'=> array('Soya.id','Soya.username'),
    'recursive' => 0, // added
    'conditions' => array(
        'Grupo.categoria' => 'Soya' , 
        'Grupo.subcategoria' => 'Productor de Oleaginosas'
    )
));

应导致此查询(如果 Soya 模型与 Grupo 有关联):

SELECT
    "Soya"."id" AS "Soya__id",
    "Soya"."username" AS "Soya__username"
FROM
    "public"."users" as "Soya"
LEFT JOIN
    "public"."Grupos" as "Grupo" on ("Soya"."grupo_id" = "Grupo"."id")
...
Possibly more joins
...
WHERE
   "Grupo"."categoria" = 'Soya' 
    AND 
    "Grupo"."subcategoria" = 'Productor de Oleaginosas'

或使用可包含的

containable behavior 可以更好地控制执行的查询。鉴于问题中的信息使用它意味着:

<?php

class Soya extends AppModel 
    // Assumed from information in the question
    public $useTable = 'users';

    public $belongsTo = array('Grupo');

    // added
    public $actsAs = array('Containable');


将允许您在控制器中执行以下操作:

$data = $this->Soya->find('list', array(
    'fields'=> array('Soya.id','Soya.username'),
    'contain' => array('Grupo'), // added
    'conditions' => array(
        'Grupo.categoria' => 'Soya' , 
        'Grupo.subcategoria' => 'Productor de Oleaginosas'
    )
));

这将生成以下查询(恰好是一个连接):

SELECT
    "Soya"."id" AS "Soya__id",
    "Soya"."username" AS "Soya__username"
FROM
    "public"."users" as "Soya"
LEFT JOIN
    "public"."Grupos" as "Grupo" on ("Soya"."grupo_id" = "Grupo"."id")
WHERE
   "Grupo"."categoria" = 'Soya' 
    AND 
    "Grupo"."subcategoria" = 'Productor de Oleaginosas'

【讨论】:

【参考方案2】:

使用关联将您的模型链接在一起:CakePHP Associations

或者,您可以使用 custom sql-statemens 连接,例如:

$db = $this->getDataSource();
$result = $db->fetchAll(
            "SELECT Soya.id AS Soya__id, Soya.username AS Soya__username FROM public.users AS Soya 
            join Grupo on Grupo.id = Soya.groupo_id
            WHERE Grupo.categoria = ? AND Grupo.subcategoria = ?",
            array('Soya', 'Productor de Oleaginosas')
        );

$this->set('oleaginosas', $result);

【讨论】:

以上是关于缺少表“Grupo” cakephp 的 FROM 子句条目的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“缺少表的 FROM 子句条目”?

Postgres:缺少表的 FROM 子句条目

错误:缺少表“用户”的 FROM- 子句条目

查询中的错误 - 缺少表的 FROM 子句条目 - SQL

表 »rowtype« 缺少 FROM 子句条目

由于缺少 PHP 扩展,CakePHP 3 无法连接到数据库