Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fabio Accoroni

Relacionamento

Recommended Posts

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');

}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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. :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

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')));

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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/

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

--> $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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

https://github.com/jrbasso/cake_ptbr/wiki/_pages

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php
class Carga extends AppModel{
 public $hasMany = array('Material');
}
?>

<?php
class Material extends AppModel{
 public $belongsTo = array('Carga');
  
}
?>

<?php
class CargasController extends AppController {
 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.