Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera, preciso de uma ajuda, deve ser coisa básica, mas ja olhei em diversos foruns e outros diversos exemplos, todos eles dizem como fazer o relacionamento, mas não consigo fazer funcionar. Ah, apenas comentando, este é meu primeiro projetinho em cake, ainda estou tentando engatinhar.
CargasController.php
<?php
class CargasController extends AppController {
public $name = 'Cargas';
//public $scaffold;
public function index() {
$this->paginate = array('limit' => 2);
$cargas = $this->paginate('Carga');
$this->set(compact('cargas'));
}
private function getMaterial(){
$materiais = $this->Carga->Material->find('list', array('fields' => array('id', 'id')));
}
public function add(){
if($this->data){
if($this->Carga->save($this->data))
$this->Session->setFlash('Carga adicionada com sucesso');
$this->data = array();
}
self::getMaterial();
}
public function edit($id = null){
if($this->data){
if($this->Carga->save($this->data))
$this->Session->SetFlash('Carga editada com sucesso');
$this->redirect(array('controller' => 'cargas', 'action' => 'index'));
}else{
$this->data = $this->Carga->read(null, $id);
}
self::getMaterial();
}
public function view($id = null){
if($id){
$carga = $this->Carga->read(null, $id);
$this->set(compact('carga'));
}
}
}
?>
carga.php
<?
class Carga extends AppModel{
public $name = 'Carga';
public $belongsTo = array('Material');
}
?>
material.php
<?
class Material extends AppModel{
public $name = 'Material';
public $hasmany = array('Carga');
}
?>Desculpa.. esqueci do mais importante. rsrs
Error: Call to a member function find() on a non-object
File: /var/www/cakephp/app/Controller/CargasController.php
Line: 13
Fiz o teste, não funcionou. :(
esse erro ele dá no action getMaterial ?
primeiro tu dá um find('all') só pra ver se ele vai fazer a consulta sem dar nenhum erro.
se der ok tu teste o teu find assim
$materiais = $this->Carga->Material->find('list', array('fields' => array('Carga.id', 'Material.id')));Ele da esse erro em:
$materiais = $this->Carga->Material->find('list', array('fields' => array('id', 'id')));
se eu coloco assim ele não da erro(mas tb não encontra, rsrsrs)
$materiais = $this->Carga->find('list', array('fields' => array('id', 'id')));
Assim tb da erro:
$materiais = $this->Material->find('list', array('fields' => array('id', 'id')));
Pelo pouco que senti, me parece que ele não encontra o 'Material', sou meio leigo em O.O mas acho que o problema ta no relacionamento pois a partir de Carga ele tinha q encontrar material, mas ele nem reconhece o MODEL.
o relacionamento tá ok.
mas você não precisa fazer o Carga->Material->find, basta o Carga->find que ele já retorna o material.
faz o que eu disse antes, dá um $this->Carga->find('all') pra ver se ele tá retornando tudo ok, se tiver tu dá o $this->Carga->find('list')
e outra coisa, você tem que dizer o id que você quer que ele retorne. tu tem que colocar o 'fields' => array('Carga.id', 'Material.id')
só pra saber, você tá querendo colocar isso num combobox ?
>
o relacionamento tá ok.
mas você não precisa fazer o Carga->Material->find, basta o Carga->find que ele já retorna o material.
faz o que eu disse antes, dá um $this->Carga->find('all') pra ver se ele tá retornando tudo ok, se tiver tu dá o $this->Carga->find('list')
e outra coisa, você tem que dizer o id que você quer que ele retorne. tu tem que colocar o 'fields' => array('Carga.id', 'Material.id')
só pra saber, você tá querendo colocar isso num combobox ?
Ok, vou testar do jeito que vc disse!
Eu vou fazer uma tela de cadastro de carga de viagem, e neste cadastro o usuario seleciona o material que esta na carga, para facilitar a montagem de relatorios não quero permitir q o usuário digite o material.Resumindo: quero colocar num combobox sim.
Ah, com relação ao ('ID', 'ID') era ('ID', 'NOME') mas quando testei tirando o Material ele deu um erro dizendo que não tinha o campo nome em carga, o que é vdd, então dupliquei o ID soh para listar algo, não era o verdadeiro, e sim teste.
Ah, só um detalhe, não existe nenhum material na carga. Essa é a tela de cadastro, ele abre varios campos para eu digitar e uma combobox com os materiais que foram pré-cadastrados quando eu salvar ele deve inserir o ID do material selecionado na tabela carga.
--> Fiz o teste, mas não veio nada no formulario no campo material.
você cadastrou alguma coisa direto no banco? cadastra só para verificar se ele tá trazendo corretamente os dados.
para carregar no combobox você tem que fazer assim
1-no model Material tu tem que colocar
public $displayField = 'nome';
2-no controller Cargas a pesquisa vai ser assim(você tem que especificar de onde é o campo que você quer)
$materiais = $this->Carga->Material->find('list', array(
'fields' => array('Material.id', 'Material.nome'),
));
3-na view vai ficar assim
<?php echo $this->Form->input('material_id'); ?>
já tinha postado isso aqui no forum e resolveu o problema da pessoa.
http://forum.imasters.com.br/topic/484839-relacionamentos-hasmany-e-belongsto/
Não cadastrei não... Vou testar e posto a resposta! Valeu
Problema persiste!
Error: Call to a member function find() on a non-object
File: /var/www/cakephp/app/Controller/CargasController.php
Line: 14
12 - private function getMaterial(){
13 -
14 - $materiais = $this->Carga->Material->find('list', array('fields' => array('Material.id', 'Material.nome')));
15 - //$materiais = $this->Carga->Material->find('list', array('fields' => array('id', 'id')));
16 - $materiais = $this->Carga->find('all');
17 - }
Caso necessário, não vejo problema algum em disponibilizar código fonte e esquema do banco para eventuais testes.
vamos por partes.
comenta essa tua linha 14 e tenta só o
$materiais = $this->Carga->find('all');
depois tu tenta o
$materiais = $this->Carga->Material->find('all');
e depois diz se deu problema em algum dos dois modos.
como ficou os nomes das tabelas?
você criou o campo carga_id na tabela materiais?
--> $materiais = $this->Carga->find('all');
Rodou
--> $materiais = $this->Carga->Material->find('all');
Mesmo erro
As tabelas são: cargas e materials(coloquei o s no fim por conta do plural)
Eu criei o Material_id na tabela Cargas
cara, se eu te disser que eu fiz os testes aqui e o problema é pq a marcação do php tá <? e não <?php.
tu tá usando windows ?
outra coisa, a carga vai ter muitos materiais, correto ?
então você tem que criar o campo carga_id na tabela materials.
desse jeito que você fez a carga só vai poder ter um material.
dica: para corrigir essa questão do plural dos nomes você pode usar o plugin cakeptbr.
https://github.com/thiagoalgo/CakePtbr
ele tem outras coisas bem interessantes.
ajuste de data, ajuste de campo float, tradução das mensagens de erro do cake
dá uma olhada
Estou usando o Debian 6.
Cara, troquei de <? para <?php nos models e ele continua acusando que estou tentando usar uma função num "não-objeto".
Realmente, mas nem me preucupei com isso... Sabe, eu vou abordando um problema de cada vez.. e a bola do dia(ultimos 10 dias) tem sido entender pq ele não chama a lista de materiais no form de cadastro de carga.
Mas obrigado mesmo pela força, independente de dar certo, e valeu pelas dicas.... assim que chegar em casa(vou ter mais tempo) eu vou dar uma olhada nos links.
Edit:Ah, dando uma olhada nos plugins eu vi que é para a versão do pho 1.3, eu uso a 2.2.5
lá tem a versão para 2.x. é no branch master, se eu não me engano.
Certo, mas o q tentei dizer foi: sera que isso não é problema de versão? Parece estar tudo certo e fica dando um erro de objeto!
cara, eu mudei o relacionamento. coloquei o carga_id em materials e coloquei o <?php e funcionou.
dá uma olhada nisso
http://odesenvolvedor.andafter.org/publicacoes/php-short_open_tag.html
Troquei todas as minhas tag de <? para <?php e o problema persiste.... acho q vou deletar tudo e começar do zero. rsrsrs
Ah... troquei tb a versão do cake.
So queria entender o pq da msg de erro, ja olhei tudo nada justifica. Problema de lógica eu corro atras, mas esse que para tudo eu não sei mais o q fazer! Tem mais de semana q nao saio deste ponto.
Sera que podia postar o código que usou para testes?
<?php
class Carga extends AppModel{
public $hasMany = array('Material');
}
?>
<?php public $belongsTo = array('Carga');
}
?>
<?php public function index() {
//$materiais = $this->Carga->Material->find('list', array('fields' => array('id', 'id')));
//debug($this->Carga->find('all'), array('recursive' => 5));
debug($this->Carga->Material->find('all'));
}
}
?>
Eu coloquei o método no index só pq eu não tinha a view que tu tava usandoE coloquei o carga_id na tabela materials.
Valeu... vou testar e volto pra responder.
Cara, valeu pela ajuda, mas deixa pra lá. Devo estar com algum problema estrutural. Copiei tudo o que postou, mas o erro persiste.
Fatal ErrorError: Call to a member function find() on a non-object
File: /var/www/cakephp/app/Controller/CargasController.php
Line: 6
Acho q vou excluir tudo e recomeçar de outra maneira.
Olá Fabio,
eu estou tendo o mesmo problema, no meu ambiente de desenvolvimento uso o PHP 5.4.3 e funciona normalmente e na produção 5.3.18, e uso a versão CakePHP 2.2.3, este problema ocorre quando eu tento acessar a classe pai de um modelo.
espero que isso nos ajude!
é bom postar a mensagem de erro também.
no teu model Material tu muda o nome da propriedade $hasmany para $hasMany e testa