problema com relacionamentos

Galera é o seguinte.

Estou tentando criar uma relação entre minha tabela de notícias e a tabela de autor. Cujo a lógica é exibir o nome do autor na view que exibe a notícia.

No meu model News tem a relations()


'author' => array(self::BELONGS_TO, 'Organization', 'idOrganizer'),

E usando o with para tentar fazer o relacionamento no método getDetailsNews()


public function getDetailsNews($idNew)

	{

		$criteria = new CDbCriteria();

		$criteria->select = "idAuthor, title, content, createDate, updateDate";

		$criteria->condition = "status = :status AND idNew = :idNew";

		$criteria->params = array(":status" => self::STATUS_ACTIVE, ":idNew" => $idNew);

		

		$news = News::model()->with(array(

			'author' => array('select' => 'idOrganizer, fullName'),

		))->find($criteria);

		

		if($news)

		{

			return $news;

		}

		else

		{

			throw new CHttpException(404, 'O sistema não foi capaz de encontrar a página solicitada.');

		}

	}

Porém exibe a seguinte mensagem de erro: [i]Error 500

A relação "author" na classe de active record "News" foi especificada com uma chave estrangeira inválida: "idOrganizer". Não existe essa coluna na tabela "news".[/i]

A tabela author tem o campo idOrganizer. Onde está o erro dessa coisa?

  • 2 perguntas.
  1. Para exibir o nome, como faria na consulta? Isso não ficou bem claro pra mim na documentação.

  2. Essa forma que estou usando é uma boa forma de se fazer? Vale lembrar que isso tudo está no model.

Cálcio,

Pelo meus entendimento vou explicar.

A tabela author tem o campo idOrganizer. Onde está o erro dessa coisa?

O idOrganizer da tabela Organization ta setado como primaryKey no banco de dados?

1) Para exibir o nome, como faria na consulta? Isso não ficou bem claro pra mim na documentação.

A consulta que você fez está correta.

Se você usar o with() na consulta, o resultado será mostrado somente as notícias que contiver o autor, caso tenha alguma noticia sem autor(No caso de administrador postar) a noticia não vai aparecer.

Se você não usar o with() na consulta, o resultado buscara TODAS as noticias que tiver ou não tiver autor.

Qualquer uma das consultas você pode buscar o autor usando dessa forma:


$news->author->fullName;

  1. Essa forma que estou usando é uma boa forma de se fazer? Vale lembrar que isso tudo está no model.

Está certo, tenta mudar para essa forma aqui, e veja se dá certo também.




public function getDetailsNews($idNew){

	$criteria = new CDbCriteria();

	$criteria->condition = "status = :status AND idNew = :idNew";

	$criteria->params = array(":status" => self::STATUS_ACTIVE, ":idNew" => $idNew);

	

	$news = News::model()->with(array('author'))->find($criteria);

	

	if($news){

		return $news;

	} else {

		throw new CHttpException(404, 'O sistema não foi capaz de encontrar a página solicitada.');

	}

}



Se precisar chamar os dados do autor usar o $news->author->attributo, caso deseja chamar os dados da noticia usa somente o $news->aributo.

Newerton, não ha uma tabela author. Só organization com o idOrganizer e a tabela news que tem o idAuthor cujo quero relacionar com idOrganizer.

O método getDetailsNews() é a leitura propriamente dita da notícia. Nela exibo o título, o nome de quem postou (Autor), data da publicação e o conteúdo da notícia. Author foi só o nome que dei ao relacionamento.

Não sei qual a frescura desse relations. Pq ele ñ aceita o relacionamento da forma que fiz? Só quero relacionar idAuthor com idOrganizer.

Fiz um teste trocando o na tabela news o campo idAuthor por idOrganizer e o maldito funcionou. Mas no contexto da tabela deveria ser idAuthor.

Não sei se esse relations é inverso da lógica ou se entendi errado. A relação é uma notícia por ter 1 autor e um Organizador pode ter várias notícias publicadas. Penso q meu relations está correto.


'author' => array(self::BELONGS_TO, 'Organization', 'idOrganizer'),

Outro teste que fiz foi trocar BELONGS_TO por HAS_ONE, esse ele ñ reclamou do relacionamento, porém relacionou errado os nomes. Li esse wiki: http://www.yiiframework.com/wiki/181/relations-belongs_to-versus-has_one/ e o exemplo é exatamente oq eu quero. Mas ñ sei o motivo de ñ funcionar comigo.

Descobri o "erro".

Esse relations tive que colocar assim:


'author' => array(self::BELONGS_TO, 'Organization', 'idAuthor'),

Ou Seja, o campo q quero relacionar é o campo do model que estou e não o campo do outro model. Que coisa birraza. Natural seria a forma que eu estava tentando usar.

Aproveitando o espaço pra outra dúvida.

Estou com dificuldade em formatar a data pelo formato do Brasil. Achei em um post que no main.php e em component poderia se usar:


'format' => array(

	'datetimeFormat' => 'd/m/Y H:i:s',

	'dateFormat' => 'd/m/Y',

	'timeFormat' => 'H:i:s',

	'numberFormat' => array(

		'decimals' => '2',

		'decimalSeparator' => ',',

		'thousandSeparator' => '.',

	),

),

Porém ñ consegui usar isso. Alguma dica?