Ajudinha em uma consulta.

Tenho um model Lancamento que tem as seguintes consultas que faz uma busca de todos os lançamento de um determinado periodo, so que precisava que ele filtra-se pelo tipo da conta que esta relacionada, se a conta tiver o campo investimento = 1 os lançamentos nao entraria na lista.

Consulta.




 $criteria = new CDbCriteria();

            $criteria->select = "COALESCE(datapagamento, datavencimento) as datap, SUM(COALESCE(valorpago, valor)) as valorp";          

            $criteria->alias = "L";

            $criteria->compare('COALESCE(datapagamento, datavencimento)','>='.date("Y-m-01").' 00:00:00');

            $criteria->compare('COALESCE(datapagamento, datavencimento)','<='.date("Y-m-t").' 23:59:59');

            $criteria->compare('status','N',true);

            $criteria->compare('tipo','C',true);        

            $receita = Lancamento::model()->findAll($criteria); 



Relaçoes:




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'categoria' => array(self::BELONGS_TO, 'Categoria', 'categoria_idcategoria'),

			'centrocustolucro' => array(self::BELONGS_TO, 'Centrocustolucro', 'centrocustolucro_idcentrocustolucro'),

			'fornecedor' => array(self::BELONGS_TO, 'Fornecedor', 'clientefornecedor_idclientefornecedor'),

                        'cliente' => array(self::BELONGS_TO, 'Cliente', 'clientefornecedor_idclientefornecedor'),

			'conta' => array(self::BELONGS_TO, 'Conta', 'conta_idconta'),

			'documento' => array(self::BELONGS_TO, 'Documento', 'documento_iddocumento'),

			'fechamentocaixa' => array(self::BELONGS_TO, 'Fechamentocaixa', 'fechamentocaixa_idfechamentocaixa'),

			'formadepagamento' => array(self::BELONGS_TO, 'Formadepagamento', 'formadepagamento_idformadepagamento'),

			'usuario' => array(self::BELONGS_TO, 'Usuario', 'usuario_id'),

		);

	}



Como eu faço para que no compare() eu busque uma comparaçao com o campo investimento da tabela conta ex:

$criteria->compare(‘conta.investimento’,1,true);

Basicamento uma join

Valew

Se bem me lembro (Faz tempo que fiz isso)

vc define o alias no relacionamento(O alias é o nome que vc vai usar dentro do compare), e faz o que vc quer, chamando o findAll com with pra seu relacionamento.

Ahe Brodi, fiz esta alteraçao:




$criteria = new CDbCriteria();

            $criteria->select = "COALESCE(datapagamento, datavencimento) as datap, SUM(COALESCE(valorpago, valor)) as valorp"; 

            $criteria->compare('COALESCE(datapagamento, datavencimento)','>='.date("Y-m-01").' 00:00:00');

            $criteria->compare('COALESCE(datapagamento, datavencimento)','<='.date("Y-m-t").' 23:59:59');

            $criteria->compare('status','N',true);

            $criteria->compare('tipo','C',true);

           

            $criteria->compare('cont.investimento',1,true);// comparaçao que preciso

            $criteria->with = array(

                'conta'=>array('together'=>true, 'alias'=>'cont')

            );

            $receita = Lancamento::model()->findAll($criteria); 



Esta dando o seguinte erro:

O active record "Lancamento" está tentando selecionar uma coluna inválida "COALESCE(datapagamento". Note, a coluna deve existir na tabela ou ser uma expressão de alias (apelido)

Alguem pode me ajudar.

Valew

pega nos logs o sql e posta aqui.

Então meu amigo, o log monstra todos os outro sql mais este diretamente nao monstra apena o erro:

Como faz para ver o sql desta consulta?

exception ‘CDbException’ with message 'O active record “Lancamento” está

tentando selecionar uma coluna inválida "COALESCE(datapagamento". Note, a

coluna deve existir na tabela ou ser uma expressão de alias (apelido)’ in

D:\websites\financeiro\framework\db\ar\CActiveFinder.php:971

Stack trace:

#0 D:\websites\financeiro\framework\db\ar\CActiveFinder.php(1261):

CJoinElement->getColumnSelect(‘COALESCE(datapa…’)

#1 D:\websites\financeiro\framework\db\ar\CActiveFinder.php(443):

CJoinQuery->__construct(Object(CJoinElement), Object(CDbCriteria))

#2 D:\websites\financeiro\framework\db\ar\CActiveFinder.php(72):

CJoinElement->find(Object(CDbCriteria))

#3 D:\websites\financeiro\framework\db\ar\CActiveRecord.php(1295):

CActiveFinder->query(Object(CDbCriteria), true)

#4 D:\websites\financeiro\framework\db\ar\CActiveRecord.php(1410):

CActiveRecord->query(Object(CDbCriteria), true)

#5 D:\websites\financeiro\protected\models\Lancamento.php(174):

CActiveRecord->findAll(Object(CDbCriteria))

#6 D:\websites\financeiro\protected\views\lancamento\index.php(151):

Lancamento->resumofinanceiro()

#7 D:\websites\financeiro\framework\web\CBaseController.php(119):

require(‘D:\websites\fin…’)

#8 D:\websites\financeiro\framework\web\CBaseController.php(88):

CBaseController->renderInternal(‘D:\websites\fin…’, Array, true)

#9 D:\websites\financeiro\framework\web\CController.php(866):

CBaseController->renderFile(‘D:\websites\fin…’, Array, true)

#10 D:\websites\financeiro\framework\web\CController.php(779):

CController->renderPartial(‘index’, Array, true)

#11

D:\websites\financeiro\protected\controllers\LancamentoController.php(267):

CController->render(‘index’, Array)

#12 D:\websites\financeiro\framework\web\actions\CInlineAction.php(50):

LancamentoController->actionIndex()

#13 D:\websites\financeiro\framework\web\CController.php(300):

CInlineAction->runWithParams(Array)

#14 D:\websites\financeiro\framework\web\filters\CFilterChain.php(134):

CController->runAction(Object(CInlineAction))

#15 D:\websites\financeiro\framework\web\filters\CFilter.php(41):

CFilterChain->run()

#16 D:\websites\financeiro\framework\web\CController.php(1144):

CFilter->filter(Object(CFilterChain))

#17 D:\websites\financeiro\framework\web\filters\CInlineFilter.php(59):

CController->filterAccessControl(Object(CFilterChain))

#18 D:\websites\financeiro\framework\web\filters\CFilterChain.php(131):

CInlineFilter->filter(Object(CFilterChain))

#19 D:\websites\financeiro\framework\web\CController.php(283):

CFilterChain->run()

#20 D:\websites\financeiro\framework\web\CController.php(257):

CController->runActionWithFilters(Object(CInlineAction), Array)

#21 D:\websites\financeiro\framework\web\CWebApplication.php(277):

CController->run(‘index’)

#22 D:\websites\financeiro\framework\web\CWebApplication.php(136):

CWebApplication->runController(‘lancamento/inde…’)

#23 D:\websites\financeiro\framework\base\CApplication.php(158):

CWebApplication->processRequest()

#24 D:\websites\financeiro\index.php(13): CApplication->run()

#25 {main} REQUEST_URI=/lancamento

Bom, eu durante o desenvolvimento coloco no config assim:




		'log'=>array(

			'class'=>'CLogRouter',

			'routes'=>array(

				array(

					'class'=>'CFileLogRoute',

					'levels'=>'error, warning, profile, trace',

				),

				// uncomment the following to show log messages on web pages

				/*

				array(

					'class'=>'CWebLogRoute',

				),

				*/

			),

 	),

Quando quero saber alguma coisa específica, pra não ficar muitos logs, eu vou excluo tudo e mando executar o que eu quero monitorar, já que o yii cria os logs automaticamente de novo.

Deve ter uma forma melhor, mas nunca procurei.

Fiz o que vc me pedio e retornou este log:




2011/11/17 12:49:47 [trace] [system.CModule] Loading "log" application component

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "request" application component

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "urlManager" application component

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "cache" application component

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.caching.CFileCache] Saving "Yii.CUrlManager.rules" to cache

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "user" application component

in D:\websites\financeiro\protected\controllers\LoginController.php (23)

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "session" application component

in D:\websites\financeiro\protected\controllers\LoginController.php (23)

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "widgetFactory" application component

in D:\websites\financeiro\protected\views\login\login.php (14)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "clientScript" application component

in D:\websites\financeiro\protected\views\login\login.php (34)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "db" application component

in D:\websites\financeiro\protected\models\Lancamento.php (56)

in D:\websites\financeiro\protected\views\layouts\login.php (36)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

2011/11/17 12:49:47 [trace] [system.db.CDbConnection] Opening DB connection

in D:\websites\financeiro\protected\models\Lancamento.php (56)

in D:\websites\financeiro\protected\views\layouts\login.php (36)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

2011/11/17 12:49:47 [trace] [system.db.CDbCommand] Querying SQL: SHOW COLUMNS FROM `lancamento`

in D:\websites\financeiro\protected\models\Lancamento.php (56)

in D:\websites\financeiro\protected\views\layouts\login.php (36)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

2011/11/17 12:49:47 [profile] [system.db.CDbCommand.query] begin:system.db.CDbCommand.query(SHOW COLUMNS FROM `lancamento`)

2011/11/17 12:49:47 [profile] [system.db.CDbCommand.query] end:system.db.CDbCommand.query(SHOW COLUMNS FROM `lancamento`)

2011/11/17 12:49:47 [trace] [system.db.CDbCommand] Querying SQL: SHOW CREATE TABLE `lancamento`

in D:\websites\financeiro\protected\models\Lancamento.php (56)

in D:\websites\financeiro\protected\views\layouts\login.php (36)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

2011/11/17 12:49:47 [profile] [system.db.CDbCommand.query] begin:system.db.CDbCommand.query(SHOW CREATE TABLE `lancamento`)

2011/11/17 12:49:47 [profile] [system.db.CDbCommand.query] end:system.db.CDbCommand.query(SHOW CREATE TABLE `lancamento`)

2011/11/17 12:49:47 [trace] [system.db.ar.CActiveRecord] Lancamento.findAll()

in D:\websites\financeiro\protected\views\layouts\login.php (36)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [trace] [system.db.CDbCommand] Querying SQL: SHOW COLUMNS FROM `Conta`

in D:\websites\financeiro\protected\views\layouts\login.php (36)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [profile] [system.db.CDbCommand.query] begin:system.db.CDbCommand.query(SHOW COLUMNS FROM `Conta`)

2011/11/17 12:49:47 [profile] [system.db.CDbCommand.query] end:system.db.CDbCommand.query(SHOW COLUMNS FROM `Conta`)

2011/11/17 12:49:47 [trace] [system.db.CDbCommand] Querying SQL: SHOW CREATE TABLE `Conta`

in D:\websites\financeiro\protected\views\layouts\login.php (36)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [profile] [system.db.CDbCommand.query] begin:system.db.CDbCommand.query(SHOW CREATE TABLE `Conta`)

2011/11/17 12:49:47 [profile] [system.db.CDbCommand.query] end:system.db.CDbCommand.query(SHOW CREATE TABLE `Conta`)

2011/11/17 12:49:47 [trace] [system.CModule] Loading "coreMessages" application component

in D:\websites\financeiro\protected\views\layouts\login.php (36)

in D:\websites\financeiro\protected\controllers\LoginController.php (31)

in D:\websites\financeiro\index.php (13)

2011/11/17 12:49:47 [error] [exception.CDbException] exception 'CDbException' with message 'O active record "Lancamento" está tentando selecionar uma coluna inválida "COALESCE(datapagamento". Note, a coluna deve existir na tabela ou ser uma expressão de alias (apelido)' in D:\websites\financeiro\framework\db\ar\CActiveFinder.php:971

Stack trace:

#0 D:\websites\financeiro\framework\db\ar\CActiveFinder.php(1261): CJoinElement->getColumnSelect('COALESCE(datapa...')

#1 D:\websites\financeiro\framework\db\ar\CActiveFinder.php(443): CJoinQuery->__construct(Object(CJoinElement), Object(CDbCriteria))

#2 D:\websites\financeiro\framework\db\ar\CActiveFinder.php(72): CJoinElement->find(Object(CDbCriteria))

#3 D:\websites\financeiro\framework\db\ar\CActiveRecord.php(1295): CActiveFinder->query(Object(CDbCriteria), true)

#4 D:\websites\financeiro\framework\db\ar\CActiveRecord.php(1410): CActiveRecord->query(Object(CDbCriteria), true)

#5 D:\websites\financeiro\protected\views\layouts\login.php(36): CActiveRecord->findAll(Object(CDbCriteria))

#6 D:\websites\financeiro\framework\web\CBaseController.php(119): require('D:\websites\fin...')

#7 D:\websites\financeiro\framework\web\CBaseController.php(88): CBaseController->renderInternal('D:\websites\fin...', Array, true)

#8 D:\websites\financeiro\framework\web\CController.php(781): CBaseController->renderFile('D:\websites\fin...', Array, true)

#9 D:\websites\financeiro\protected\controllers\LoginController.php(31): CController->render('login', Array)

#10 D:\websites\financeiro\framework\web\actions\CInlineAction.php(50): LoginController->actionLogin()

#11 D:\websites\financeiro\framework\web\CController.php(300): CInlineAction->runWithParams(Array)

#12 D:\websites\financeiro\framework\web\CController.php(278): CController->runAction(Object(CInlineAction))

#13 D:\websites\financeiro\framework\web\CController.php(257): CController->runActionWithFilters(Object(CInlineAction), Array)

#14 D:\websites\financeiro\framework\web\CWebApplication.php(277): CController->run('login')

#15 D:\websites\financeiro\framework\web\CWebApplication.php(136): CWebApplication->runController('login/login')

#16 D:\websites\financeiro\framework\base\CApplication.php(158): CWebApplication->processRequest()

#17 D:\websites\financeiro\index.php(13): CApplication->run()

#18 {main} REQUEST_URI=/

2011/11/17 12:49:47 [trace] [system.CModule] Loading "errorHandler" application component




Não veio o SQL :(

Mas tudo bem. Agora a tarde eu to mechendo no sistema e achei um exemplo que pode te ajudar(ou complicar ainda mais):

Eu tinha um caso mais simples e alterei pra ficar mais próximo do que vc está usando:




$criteria = new CDbCriteria();

$criteria->compare('Enderecos.ativo', '=1');

$criteria->with= array(

	'Enderecos'=>array('alias'=>'Enderecos')

);

$models = Empresa::model()->findAll($criteria);

E no model está assim:


 public function relations()    {

		return array(

			'Contatos' => array(self::HAS_MANY, 'Contato', 'empresa'),

			'PagadorVale' => array(self::BELONGS_TO, 'Empresa', 'pagadorvale'),

			'Dependentes' => array(self::HAS_MANY, 'Empresa', 'pagadorvale'),

   		'Enderecos' => array(self::HAS_MANY, 'Endereco', 'empresa'),

		);

	}



A questão é que o meu ta funcionando bem. Então eu acho que, por algum motivo obscuro o Yii possa estar se enrolando ao gerar o SQL com as colunas personalizadas. Outro ponto é que vc ta usando o sum sem um group by. Dependendo do banco pode não funcionar. (Alo SQL Server)

Realmente deve ser as colunas personalizadas pois desta forma que vc enviou ja tentei fazer e nada… vou ver se mudo a forma que estou fazendo para uma forma que de certo pois eu ja estou ficando louco kkkkk…

Valew Daniel a ajuda…