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.
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.
Para exibir o nome, como faria na consulta? Isso não ficou bem claro pra mim na documentação.
Essa forma que estou usando é uma boa forma de se fazer? Vale lembrar que isso tudo está no model.
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;
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.
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.
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: