从cakephp中的控制器加载关联时出错

时间:2015-06-06 16:49:37

标签: join cakephp-3.0

我无法正确查询这个简单的查询。我需要将adresses表加入我的annonces表。

我认为这应该远远地向前发展,但我根本无法让它发挥作用。

我首先制作了我的adresse表格对象

class AdressesTable extends Table
{
    public function initialize(array $config)
    {                                   
        $this->belongsTo('Annonces', [
                                    'foreignKey' => 'annonceId',
                                    'joinType' => 'INNER',
                                ]);
    }
}

然后在我的annonces控制器中,我试图加入像这样的地址

public function view($id = null)
{
    if (!$id) {
        throw new NotFoundException(__('Annonce invalide!'));
    }
    $query = $this->Annonces->find('all', ['contain' => ['Adresses']])->where(['id' => $id]);
    $annonce = $query->firstOrFail();
    $this->set(compact('annonce'));
}

但后来我收到了这个错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Adresses.annonce_id' in 'where clause'

巫婆我不明白为什么我得到它,因为我在AdressesTable class中定义了我的外键。

我想在最后得到的查询看起来像这样

SELECT * 
FROM annonces
INNER JOIN adresses ON adresses.annonceId = annonces.id
WHERE annonces.id = @param 

* PS。我知道不会选择*而是选择[我的所有专栏] *

编辑:我的表架构如下

CREATE TABLE annonces(
    id INT NOT NULL AUTO_INCREMENT,     #PK
    startDate DATE NOT NULL,
    endDate DATE NOT NULL,
    title VARCHAR(128) NOT NULL,
    descript TEXT NOT NULL,
    infoSupplementaire TEXT NULL,
    premium BIT NOT NULL,
    clientId INT NOT NULL,              #FK
    categorieId INT NOT NULL,           #FK

    CONSTRAINT pk_annonces_id PRIMARY KEY (id),
    CONSTRAINT fk_annonces_clientId FOREIGN KEY (clientId) REFERENCES clients(id),
    CONSTRAINT fk_annonces_categorieId FOREIGN KEY (categorieId) REFERENCES categories(id)
);

CREATE TABLE adresses(
    id INT NOT NULL AUTO_INCREMENT,     #PK
    latitude DECIMAL(11,7),
    longitude DECIMAL(11,7),
    adresse VARCHAR(512),
    annonceId INT NOT NULL,             #FK

    CONSTRAINT pk_adresses_id PRIMARY KEY (id),
    CONSTRAINT fk_adresses_annonceId FOREIGN KEY (annonceId) REFERENCES annonces(id)
)

我通过重命名我的下列cakephp约定并使用this answer中的任何代码

解决了我的问题

1 个答案:

答案 0 :(得分:1)

你可以尝试

$query = $this->Annonces->find('all', ['contain' => ['Adresses']])->where(['Annonces.id' => $id]);
$annonce = $query->firstOrFail();

OR

public function view($id = null)
{
    if (!$id) {
        throw new NotFoundException(__('Annonce invalide!'));
    }
    $annonceEntity = $this->Annonces->get($id);

    $query = $this->Annonces->find('all', ['contain' => ['Adresses']])->where(['Annonces.id' => $annonceEntity->id]);
    $annonce = $query->firstOrFail();
    $this->set(compact('annonce'));
}