Ir para conteúdo

POWERED BY:

Arquivado

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

lucasvocals

[Resolvido] Excluir dados de tabelas ligadas.

Recommended Posts

Olá,

 

preciso excluir o registro da tabela pessoa por uma view de funcionario!

 

Excluindo funcionario tem que excluir a pessoa e o endereço junto. Visto que a tabela funcionario recebe pessoa_id, e a tabela Pessoa recebe endereco_id.

 

Ainda, tenho uma tabela users, que recebe funcionario_id. Esse eu consegui excluir certo apenas habilitando o delete cascade. Agora Pessoa e Endereço eu não consegui.

 

Por lógica seria apenas pegar a Pessoa com id igual ao pessoa_id do registro que eu to excluindo e excluir também.. tentei fazer isso mas não deu.. alguma sujestão?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

O deleteAll não resolve?

 

http://book.cakephp....w/692/deleteAll

 

Eu também preciso aprender, pois preciso deletar uma categoria e todos os posts ligados à ela... bom... é o mesmo caso que o seu [parecido]

Compartilhar este post


Link para o post
Compartilhar em outros sites

O deleteAll não resolve?

 

http://book.cakephp....w/692/deleteAll

 

Eu também preciso aprender, pois preciso deletar uma categoria e todos os posts ligados à ela... bom... é o mesmo caso que o seu [parecido]

 

 

 

Não é bem isso..

 

A unica parte igual é deletar user junto, e isso eu consegui.

 

mas eu preciso deletar um registro que o Funcionario é dependente, que é pessoa..

 

Se eu deleto o funcionario, a Pessoa ligada akele funcionario continua cadastrada, e caso esse funcionario volte a trabalhar na empresa, vai ter duas pessoas com mesmo nome, telefone, cpf, blablabla, por isso preciso deletar também a pessoa depois de ter deletado funcionario e usuario..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, entendi... bom.. é exatamente o que vou estudar agora!

Pesquisarei aqui e verei o que posso fazer.

 

Bom... Tô chegando perto:

http://localhost/min...gposts/delete/6

 

Faz isso aki pra eu ver o array:

 

function delete( $id = null ) {

 	$data = $this->Post->findByCategpostId( $id );

 	pr( $data );
	}

No meu caso retornou assim:

 

Array
(
 [Post] => Array
 (
 [id] => 61
 [categpost_id] => 6
 [photo] => 21153420100803.jpg
 [title] => bla bla blá
 [slug] => bla_bla_bl__
 [body] => 
 Insira seu texto aqui...



 [p_type] => posts
 [created] => 2010-08-03 21:15:34
 [modified] => 2010-08-03 21:15:35
 )

 [categpost] => Array
 (
 [id] => 6
 [title] => Categoria 3
 [created] => 2010-08-03 21:15:13
 [modified] => 2010-08-03 21:15:13
 )

)

Deveria retornar-me todos os tópicos que tivessem categoria 6 mas só me retornou um único tópico...

 

A query retornada:

 

SELECT `Post`.`id`, `Post`.`categpost_id`, `Post`.`photo`, 
`Post`.`title`, `Post`.`slug`, `Post`.`body`, `Post`.`p_type`, 
`Post`.`created`, `Post`.`modified`, `categpost`.`id`, 
`categpost`.`title`, `categpost`.`created`, `categpost`.`modified` FROM 
`posts` AS `Post` LEFT JOIN `categposts` AS `categpost` ON 
(`Post`.`categpost_id` = `categpost`.`id`) WHERE `Post`.`categpost_id` = 6 LIMIT 1

Também tentei assim:

 

$dataPost = $this->Post->find( array( 'Categpost.id'=>$id ) );
Mas a query é idêntica...

 

Você consegue consertar isso e usar no seu código?

 

Não quero que fique limitado apenas pra 1 tópico...

 

 

* Modifica pra suas configurações ;)

 

Bom... verifica assim:

 

 

$conditions = array( 'Post.categpost_id'=>$id );
 	$dataPost = $this->Post->find( 'list', array( 'conditions'=>$conditions ) );
 	pr( $dataPost );

Se 'list' for alterado para 'all' veja como será retornado:

 

Array
(
 [0] => Array
 (
 [Post] => Array
 (
 [id] => 61
 [categpost_id] => 6
 [photo] => 21153420100803.jpg
 [title] => bla bla blá
 [slug] => bla_bla_bl__
 [body] => <p>
	Insira seu texto aqui...</p>

 [p_type] => posts
 [created] => 2010-08-03 21:15:34
 [modified] => 2010-08-03 21:15:35
 )

 [categpost] => Array
 (
 [id] => 6
 [title] => Categoria 3
 [created] => 2010-08-03 21:15:13
 [modified] => 2010-08-03 21:15:13
 )

 )

 [1] => Array
 (
 [Post] => Array
 (
 [id] => 62
 [categpost_id] => 6
 [photo] => 
 [title] => fsadfsdaf
 [slug] => fsadfsdaf
 [body] => <p>
	Insira seu texto aqui...</p>

 [p_type] => posts
 [created] => 2010-08-03 21:36:05
 [modified] => 2010-08-03 21:36:05
 )

 [categpost] => Array
 (
 [id] => 6
 [title] => Categoria 3
 [created] => 2010-08-03 21:15:13
 [modified] => 2010-08-03 21:15:13
 )

 )

 

E por úlotimo:

 

if( $this->Post->deleteAll( $conditions ) ) {
 	$this->Categpost->delete( $id );
 	}

Isso irá deletar todos os tópicos daquela categoria! :}

 

Pelo menos comigo funfou legalzíssimo! :}

 

 

 

Dá uma lida em:

 

http://book.cakephp....Find-Conditions

 

E traduzido:

 

http://translate.goo...Find-Conditions

 

Me ajudou pakas =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí velho!

 

 

Amanhã cedo quando chegar no trampo vou testar. Não sei se é exatamente isso que eu preciso, mas talvez já me ajude.

 

Acho que no seu caso, o que eu preciso é deletar um post, e com isso deletar a categoria dele também saca? O que eu preciso fazer é o contrário do que você precisa!

 

Mas acho que com isso eu consigo chegar lá, só tenho que pegar o ID antes de excluir e dps que excluir um mandar excluir o outro. Acho que eu não tava pegando o ID corretamente. Amanhã vejo isso bem cedo e posto aqui!

 

 

Valeu mano!

Compartilhar este post


Link para o post
Compartilhar em outros sites

kkkkkkk

 

Não pow

 

Acha que eu iria fazer algo esquisito como isso que você falou?

 

É exatamente o que você precisa!

 

Ele seleciona primeiro somente aqueles tópicos correspondentes à id da categoria ( pega a id da categoria por get )

 

e depois ele deleta todos estes tópicos....

Compartilhar este post


Link para o post
Compartilhar em outros sites

kkkkkkk

 

Não pow

 

Acha que eu iria fazer algo esquisito como isso que você falou?

 

É exatamente o que você precisa!

 

Ele seleciona primeiro somente aqueles tópicos correspondentes à id da categoria ( pega a id da categoria por get )

 

e depois ele deleta todos estes tópicos....

 

IUAEHIAEUH

 

É que meu banco está asbtraído demais nessa parte de "pessoa"

 

 

 

Tabela PESSOA:

Nome

Telefone

Email

endereco_id

 

Tabela Funcionario:

pessoa_id

cargo_id

unidade_id (qual fabrica trabalha)

departamento_id

 

 

Sendo que pessoa não tem controller nem views.. os cadastros são feitos apartir de funcionario...saca?

Assim eu posso ter outra tabela fornecedor, fabricante, etc etc etc, todos pessoas, porem cada um é uma coisa distinta..

 

Nesse formato, no cadastro de um funcionario eu tenho todos os dados de pessoa e funcionario pra cadastrar!

por isso que eu digo que é ao contrario doq tu ta fazendo..

 

Se fosse comparar, funcionario seriam os posts, e pessoa seria a categoria.. e quando eu excluo um funcionario, eu obrigatoriamente preciso excluir a pessoa linkada a ele!

 

Entendeu? Orientação a Objetos no banco cara.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu entendi isso desde o início, mas pedi pra você fazer as devidas modificações kkkkkkkk

 

Bom, já que não entendeu o que é pra modificar, então lá vai:

 

categpost = pessoa

 

post = funcionario

 

pronto, testa aí! :)

 

 

Ah... este código limita quais caracteres você deseja que apareçam:

 

$conditions = array( 'Post.categpost_id'=>$id );
 	$fields = array( 'id', 'title' );
 	$dataPost = $this->Post->find( 'list', array( 'fields'=>$fields, 'conditions'=>$conditions ) );

pr($dataPost);

array:

 

Array
(
 [59] => Conquistando novos clientes
 [60] => Layouts para sites
)

Agora... não sei usar isto a meu favor para deletar vários diretórios =/

Ridículo não é mesmo?! kkkkk

Bom, só tenho 2 semanas e meia de cakePHP ~~

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, todos estamos curiosos para saber como você resolveu,... conta aí.. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, todos estamos curiosos para saber como você resolveu,... conta aí.. :)

 

function delete($id = null) {					
	$conditions = array( 'Funcionario.pessoa_id'=>$id );				
	if( $this->Funcionario->delete($conditions)):
        	if($this->Pessoa->delete($id)):
			$this->Endereco->delete($id);
			$this->Session->setFlash('Registro excluído com sucesso!');
			$this->redirect('read/');
		endif;
        endif;		
}

Fiz basicamente o mesmo que você, única diferença é que não usei o deleteAll..

E não me pergunte porque funciona o $this->Endereco->delete($id); pq eu não sei, só sei que deleta o endereço certo. IUHAIUHA

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito...

Vai funcionar sim, mas da forma que eu fiz, estou retornando dados com o método find() para manipular arquivos salvos no BD ou outras coisas ;)

 

Bom... sempre que alguém tiver dúvidas sobre isto, espero que utilizem este tópico como base!

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara. descobri que nem precisa daquele $conditions. Ele já pega o ID certo, quando passo por GET lá na view e já deleta corretamente os registros que eu quero.

 

Fica assim:

function delete($id = null) {
	if( $this->Funcionario->delete($id)):
        	if($this->Pessoa->delete($id)):
			if($this->Endereco->delete($id)):
			      $this->Session->setFlash('Registro excluído com sucesso!');
			      $this->redirect('read/');
                        endif;
		endif;
        endif;		
}

Funciona perfeitamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhor, já que você só vai deletar dados do BD... Se fosse precisar retornar dados, aí sim utilizaria o find().

Bom, então tá resolvido não é?

 

Abraços []s

Compartilhar este post


Link para o post
Compartilhar em outros sites

PSSSSSSS

 

Descobri que não está resolvido não aiuhaiuhaiuhia

 

Vou precisar retornar os ID's de Pessoa e Endereço e fazer as comparações pra deletar. Com user eu consegui usando:

 

$user_id = array('User.funcionario_id' => $id);
$deleta_user = $this->Funcionario->User->find('list', array('conditions' => $user_id));

Nesse caso eu comparo o funcionario_id de User com o ID que tenho na tabela funcionarios

Porém agora, preciso comparar o pessoa_id da tabela funcionarios com ID da tabela pessoas. É um processo contrário.

 

Da maneira que eu tinha feito, funcionava somente se o os ID's fossem todos iguais. Mas nem sempre vai ser assim, então terei que fazer a busca pelos ID's de qualquer forma.

 

Alguma idéia de como fazer?

 

=((((((((((((

Compartilhar este post


Link para o post
Compartilhar em outros sites

ai ai

 

Aquele código q você postou antes buscava id

 

$conditions = array( 'Funcionario.pessoa_id'=>$id ); 
 if( $this->Funcionario->delete($conditions)):

Só que ele teria que ser reescrito:

 

 

$fiels = array( 'id' );
$data = $this->Post->find( 'list', array( 'fields'=>$fields, 'conditions'=>$conditions ) );
# Retornaod dados
echo $data[Model][campo];

Compartilhar este post


Link para o post
Compartilhar em outros sites

lol. Acho que a gente não está se entendendo velho.

 

o que a variavel $id vai me trazer? Na minha cabeça ela serve para o ID de funcionario, e eu NAO preciso desse id. Preciso do ID de PESSOA.

 

Desse jeito que você ta falando não funciona.

 

Tentei buscar o id fazendo: $pessoa_id = $data['Funcionario']['pessoa_id']; mas ele não reconhece $data.

 

Acho que eu não to entendendo o funcionamento de alguma coisa ae pq não ta me trazendo nenhum id nos testes q eu faço.

 

Minha função tá assim agora e da erro ao excluir pessoa:

 

function delete($id = null) {
	$user_id = array('User.funcionario_id' => $id);
	$deleta_user = $this->Funcionario->User->find('list', array('conditions' => $user_id));	
						
	if($this->User->delete($deleta_user)):						
		$pessoa_id =  $data['Funcionario']['id_pessoa'];	
		$deleta_pessoa = $this->Funcionario->Pessoa->find('list', array('conditions' => $pessoa_id));
														
		if( $this->Funcionario->delete($id)):
			if($this->Pessoa->delete($pessoa_id)):						
				if($this->Endereco->delete($id)):
					$this->Session->setFlash('Registro excluído com sucesso!');
					$this->redirect('read/');
				else:
					$this->Session->setFlash('Erro ao deletar ENDERECO!');
					$this->redirect('read/');
				endif;
			else:
				$this->Session->setFlash('Erro ao deletar PESSOA!');
				$this->redirect('read/');
			endif;
		else:
			$this->Session->setFlash('Erro ao deletar FUNCIONARIO!');
			$this->redirect('read/');
		endif;
	else:
		$this->Session->setFlash('Erro ao deletar USER!');
	        $this->redirect('read/');		
	endif;		
}

coloquei esses flash podres pra saber onde ele ta errando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz assim:

 

 

$fiels = array( 'id' );

$data = $this->Model->find( 'list', array( 'fields'=>$fields, 'conditions'=>$conditions ) );

pr($data);

 

Quero só ver se não vai listar todas as ids

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz assim:

 

 

$fiels = array( 'id' );

$data = $this->Model->find( 'list', array( 'fields'=>$fields, 'conditions'=>$conditions ) );

pr($data);

 

Quero só ver se não vai listar todas as ids

 

 

tá, perfeito... mas como eu faço pra acessar essas Id's?

 

tentei usando algo do tipo $idPessoa = $data['Pessoa']['id'] ou $data['Funcionario']['Pessoa']['id'] e não deu..

 

://

 

 

edit:

Usando o list eu não consigo retornar nada com o pr, mas usando all lista tudo daí

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta é a linha do problema?

 

$pessoa_id = $data['Funcionario']['id_pessoa'];

 

tente:

 

$pessoa_id = $data['Funcionario']['chave_estrangeira'];

'chave_estrangeira' = aqui a chave estrangeira

 

Não tem mais ninguém pra ajudar tb?

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.