ennio21

Untitled

Sep 2nd, 2020
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.41 KB | None | 0 0
  1. <?php
  2. /*
  3. Nesses casos eu uso eventos do Model
  4.  
  5. No seu caso é um fornecedor tem que ter o endereço, e fornecedor->endereço_id não pode ser null, certo?
  6.  
  7.  
  8. Faz assim no model:
  9. */
  10.  
  11. class Fornecedor extends Model {
  12.    
  13.    
  14.     // dessa forma você pode chamar o método endereço na classe Fornecedor
  15.     // Ex.:
  16.     // $fornecedor = Fornecedor::first();
  17.     // $fornecedor->endereco
  18.     // DOC REF https://laravel.com/docs/7.x/eloquent-relationships#one-to-one
  19.     public function endereco()
  20.     {
  21.         return $this->hasOne(Endereco::class);
  22.     }
  23.    
  24.    
  25.     // criar um attribute para guardar o endereço temporariamente
  26.     // PS.: eu sei que tá fora de lugar, é apenas seguir a ordem do raciocício
  27.     private $enderecoQueue = [];
  28.    
  29.     // cria um mutator
  30.     // DOC REF: https://laravel.com/docs/7.x/eloquent-mutators#defining-a-mutator
  31.     public function setEnderecoAttribute(array $value)
  32.     {
  33.         $this->enderecoQueue = $value;
  34.     }
  35.    
  36.    
  37.    
  38.     // nesse passo a gente vai ouvir os eventos deste model
  39.     // DOC REF https://laravel.com/docs/7.x/eloquent#events
  40.     // Você pode criar um Observer, mas para simplificar vou usar Closures
  41.     //
  42.     // como esses eventos funcionam
  43.     // após você chamar o método save() do model tanto para criar o registro no banco quanto para atualizar são disparados alguns eventos
  44.     // Exemplos:
  45.     // o evento "creating" é chamado antes de criar o registro no banco de dados
  46.     // o evento "created" é chamado depois de criar o registro no banco de dados
  47.     protected static function booted()
  48.     {
  49.         // criar o endereço antes de criar o fornecedor
  50.         static::creating(function (self $fornecedor) {
  51.             // pega uma nova instancia do model Endereco com base no relacionamento definido no model Fornecedor
  52.             $endereco = $fornecedor->endereco()->getRelatedModel();
  53.            
  54.             $endereco->create($fornecedor->enderecoQueue);
  55.            
  56.             $fornecedor->endereco_id = $endereco->id;
  57.         });
  58.     }
  59.  
  60. }
  61.  
  62. class MeuController extends Controller {
  63.     /*Agora você pode fazer assim*/
  64.     public function store(Request $request) {
  65.         Fornecedor::create([
  66.             'cnpj'=> $request->cnpj,
  67.             'razao_social'=> $request->razao_social ,
  68.             'endereco'=> [
  69.                 'cidade'=> $request->cidade,
  70.                 'logradouro'=> $request->logradouro,
  71.             ],
  72.         ]);
  73.     }
  74. }
  75.  
  76.  
  77. //PS.: Eu não testei o código: eu apenas apresentei a lógica com exemplo de código
Add Comment
Please, Sign In to add comment