Olá pessoal,
Estou com o seguinte problema, criei uma estrutura de relacionamento Muitos para Muitos em PHP utilizando a bilbioteca Lumine e ao efetuar uma consulta recebo o erro: Unknown column 't.tenant_id' in 'on clause'
Segue abaixo a estrutura e as configurações que estou utilizando:
TABELAS:
accounts - Registro de usuários do sistema
- id int PK
- email varchar(100) UK
- password varchar(100)
- is_activated tinyint
- is_blocked tinyint
tenants - Registro de Grupos de Usuários
- id int PK
- name varchar(100) UK
tenants_accounts - Tabela vinculo de contas e grupo de contas
- tenant_id int
- account_id int
CLASSES DAO:
AccountsDao - Mapeamento da Tabela accounts do Lumine
- public $tenants = array();
- # Relacionamento muitos para muitos com Classe Tenants
- $this->_addForeignRelation('tenants', self::MANY_TO_MANY, 'TenantsDao', 'tenants', 'tenants_accounts', 'account_id', null);
TenantsDao - Mapeamento da Tabela tenants do Lumine
- public $accounts = array();
- # Relacionamento muitos para muitos com Classe Accounts
- $this->_addForeignRelation('accounts', self::MANY_TO_MANY, 'AccountsDao', 'accounts', 'tenants_accounts', 'tenant_id', null);
CONSULTA SENDO EFETUADA:
$accountDao = new AccountsDao();
$tenantDao = new TenantsDao();
// Recupera a conta do e-mail e tenant para criar a sessão.
$accountDao->alias('ac');
$accountDao->join($tenantDao, 'LEFT', 't', 'id', 'accounts');
$accountDao->limit(1);
$accountDao->where('ac.email = ?', $email);
$accountDao->select('ac.id, ac.email, ac.password, ac.isActivated, ac.isBlocked, t.name as tenant');
$quantity = $accountDao->find();
RESULTADO OBTIDO:
Unknown column 't.tenant_id' in 'on clause'
Se alguém puder me ajudar dizendo o que estou fazendo de errado fico muito grato.
Publicidade
|
|
Page 1 of 1
Lumine MOR - Dúvida com consulta Muitos para Muitos Dúvida com consulta Muitos para Muitos
#2
Posted 10 March 2011 - 10:06 AM
Olá,
Seria interessante você postar também o mapeamento feito nas classes.
Caso você tenha feito o mapeamento manualmente, pode ser que haja algum problema de digitação.
Outra coisa, como você está mapeando as classes, troque isto:
Por isto
Os 4º e 5º parametros são para especificar os campos caso eles não tenham sido mapeados.
@braços e fique com Deus!
Seria interessante você postar também o mapeamento feito nas classes.
Caso você tenha feito o mapeamento manualmente, pode ser que haja algum problema de digitação.
Outra coisa, como você está mapeando as classes, troque isto:
$accountDao->join($tenantDao, 'LEFT', 't', 'id', 'accounts');
Por isto
Quote
$accountDao->join($tenantDao, 'LEFT', 't');
Os 4º e 5º parametros são para especificar os campos caso eles não tenham sido mapeados.
@braços e fique com Deus!
#3
Posted 10 March 2011 - 07:51 PM
hufersil, on 10 March 2011 - 10:06 AM, said:
Olá,
Seria interessante você postar também o mapeamento feito nas classes.
Caso você tenha feito o mapeamento manualmente, pode ser que haja algum problema de digitação.
Outra coisa, como você está mapeando as classes, troque isto:
Por isto
Os 4º e 5º parametros são para especificar os campos caso eles não tenham sido mapeados.
@braços e fique com Deus!
Seria interessante você postar também o mapeamento feito nas classes.
Caso você tenha feito o mapeamento manualmente, pode ser que haja algum problema de digitação.
Outra coisa, como você está mapeando as classes, troque isto:
$accountDao->join($tenantDao, 'LEFT', 't', 'id', 'accounts');
Por isto
Quote
$accountDao->join($tenantDao, 'LEFT', 't');
Os 4º e 5º parametros são para especificar os campos caso eles não tenham sido mapeados.
@braços e fique com Deus!
Verificando o Log gerado, o Lumine está gerando a seguinte Query no banco:
Quote
10/03/2011 18:43:21 - LOG: Executando consulta:
SELECT
ac.id, ac.email, ac.password, ac.is_activated, ac.is_blocked, t.name as tenant
FROM
accounts ac
LEFT JOIN tenants_accounts ON
tenants_accounts.account_id = ac.account_id
LEFT JOIN tenants t ON
tenants_accounts.tenant_id = t.tenant_id
WHERE
ac.email = 'reinaldo.coelho@gmail.com' LIMIT 1
(/.../lib/lumine-persistence/lib/Dialect/
MySQL.php, 178)
SELECT
ac.id, ac.email, ac.password, ac.is_activated, ac.is_blocked, t.name as tenant
FROM
accounts ac
LEFT JOIN tenants_accounts ON
tenants_accounts.account_id = ac.account_id
LEFT JOIN tenants t ON
tenants_accounts.tenant_id = t.tenant_id
WHERE
ac.email = 'reinaldo.coelho@gmail.com' LIMIT 1
(/.../lib/lumine-persistence/lib/Dialect/
MySQL.php, 178)
O que há de errado nessa query é que a tabela "accounts" não tem uma coluna "account_id" e sim uma "id", o mesmo ocorre com a tabela "tenants".
Vou tentar identificar o que posso ter feito de errado no mapeamento para que ele não tente utilizar as colunas com o mesmo nome.
Os mapeamentos foram gerados de forma manual, eu particularmente gosto de entender o que está sendo feito e por isso acabo sofrendo com alguns erros a mais :-)
Vou verificar e se encontrar o erro eu apresento.
Obrigado,
Reinaldo.
#4
Posted 10 March 2011 - 08:34 PM
hufersil, on 10 March 2011 - 10:06 AM, said:
Olá,
Seria interessante você postar também o mapeamento feito nas classes.
Caso você tenha feito o mapeamento manualmente, pode ser que haja algum problema de digitação.
Outra coisa, como você está mapeando as classes, troque isto:
Por isto
Os 4º e 5º parametros são para especificar os campos caso eles não tenham sido mapeados.
@braços e fique com Deus!
Seria interessante você postar também o mapeamento feito nas classes.
Caso você tenha feito o mapeamento manualmente, pode ser que haja algum problema de digitação.
Outra coisa, como você está mapeando as classes, troque isto:
$accountDao->join($tenantDao, 'LEFT', 't', 'id', 'accounts');
Por isto
Quote
$accountDao->join($tenantDao, 'LEFT', 't');
Os 4º e 5º parametros são para especificar os campos caso eles não tenham sido mapeados.
@braços e fique com Deus!
Hugo,
Consegui resolver o problema.
No final foram duas coisas:
1 - Retirei o parâmetro que você sugeriu no final do "join", ele estava quebrando a tabela de relacionamento do sistema e o meu resultado era um 1PN.
2 - Encontrei minha falha no mapeamento conforme sugerido, o problema era a coluna que vem logo após a Classe que eu estava mapeando para a coluna referente a coleção da outra classe ao invés de mapear com o ID. A versão correta ficou assim:
Quote
# Relacionamento muitos para muitos com Classe Tenants
$this->_addForeignRelation('tenants', self::MANY_TO_MANY, 'TenantsDao', 'id', 'tenants_accounts', 'account_id');
# Relacionamento muitos para muitos com Classe Accounts
$this->_addForeignRelation('accounts', self::MANY_TO_MANY, 'AccountsDao', 'id', 'tenants_accounts', 'tenant_id');
$this->_addForeignRelation('tenants', self::MANY_TO_MANY, 'TenantsDao', 'id', 'tenants_accounts', 'account_id');
# Relacionamento muitos para muitos com Classe Accounts
$this->_addForeignRelation('accounts', self::MANY_TO_MANY, 'AccountsDao', 'id', 'tenants_accounts', 'tenant_id');
Hugo, muito obrigado pela paciência e parabéns pelo projeto.
Abraço,
Reinaldo.
Share this topic:
Page 1 of 1
Similar Topics
| Topic | Forum | Started By | Stats | Last Post Info | |
|---|---|---|---|---|---|
|
Final Fantasy I e II serão lançados para o PSP
|
Notícias |
Notícias
|
|
|
|
BG flash + BG html + Sombra
BG html igual BG do flash com sombra |
Flash & ActionScript |
luislins
|
|
|
|
Organizar Posição de MC por AS
Enviar para frente ou para trás! |
Flash & ActionScript |
rbaialuna
|
|
|
|
Twitter abre espaço para propaganda política paga
|
Notícias |
Notícias
|
|
|
|
Câmera com apenas 2,2 cm de espessura chega ao mercado
|
Notícias |
Notícias
|
|
|
|
Globo projeta TV digital rural para substituir parabólica
|
Notícias |
Notícias
|
|
|
|
Veja como melhorar o desempenho do Windows
|
Notícias |
Notícias
|
|
|
|
UOL arrecada R$ 624 mi com ações na bolsa
WNews |
Notícias |
TiTi Celestino
|
|
Publicidade
|
|

Help













