Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida - "Ultimas Noticias"

Olá, essa parece uma dúvida fácil, mas não achei nada com o que me basear, por isso estou aqui =D

Eu estou criando um site onde contém produtos e promoções, eu queria saber como eu faço para deixar na pagina "Inicio" as ultimas noticias, ou seja os produtos ou promoções mais recente.

É uma pagina com 6 itens, esses itens devem variar entre produtos e promoções, no caso os mais recentes, mas eu não sei como eu faço isso, eu teria que fazer uma consulta nas duas tabelas e ordenar por mais recente e mandar um take(6) ?

Alguém poderia me ajudar? poderia ser a ideia como fazer essa consulta, só para clarear a mente.

Desde já obrigado!

6 respostas

Um jeito de fazer é assim:

  • Crie as migrations:
produto (titulo, descricao, preco, ...)
promocao (ativa, nome, duracao, inicio, fim, ...)
promocao_produtos (produto_id, promocao_id)
  • Crie os respectivos Models para esses 3 acima com as relations
ProdutoModel: produto() belongsToMany promocao
PromocaoModel: promocao() belongsToMany produto
  • Crie os Controllers
PrincipalController@index

$promocoes = Promocao::where('ativa', 'sim')->first();
return view('promocoes')->with('promocoes', $promocoes);
  • Crie as views
produto.blade.php
promocoes.blade.php

Em promocoes.blade você usa:

@foreach($promocoes as $promocao)
    @foreach($promocao->produtos as $produto)
        $produto->imagem
        $produto->preco
        ...
  1. https://laravel.com/docs/5.4/migrations#generating-migrations
  2. https://laravel.com/docs/5.4/eloquent-relationships#many-to-many
  3. https://laravel.com/docs/5.4/eloquent#retrieving-models
  4. https://laravel.com/docs/5.4/blade#loops

@RICARDO AUGUSTO DO CARMO, eu não consegui explicar direito, muito obrigado pela explicação, mas o que eu quero fazer é mais simples, assim eu acho, eu não quero usar as relações de tabelas, é apenas juntar os ultimos dados colocado no banco dessas tabelas e mandar pra view.

ex: $produto = Produtos::orderBy('creat_at' , 'desc')->get();

ele vai pegar todos os dados da tabela Produtos e ordenar pela mais recentes, eu quero fazer isso com a tabela Promocoes tbm, ele ordenar os dois em uma consulta só e mandar para a view, na view vai ser mostrado só 6 itens, no caso tem que ser os 6 itens mais recentes, eles serão misturados entre promocao e produto, eu consigo fazer separado, uma consulta para cada tabela, eu queria saber como fazer para juntar os dois e ae ordenar por mais recente e manda pra view.

Acho que entendi assim:

Produtos (id titulo descricao imagem preco)
Promocoes (id titulo descricao imagem preco)

Ou seja, você está usando dois Models separados pra guardar informações idênticas.

Tenta isso:

  1. Juntar a Produtos::all() com Promocoes::all() https://laravel.com/docs/5.4/collections#method-merge
  2. E ordenar pelo updated_at https://laravel.com/docs/5.4/collections#method-sortby

Se ainda não for isso, então eu desisto rs

@RICARDO AUGUSTO DO CARMO, é exatamente isso que eu quero, mas quando eu uso o Merge ele substitui os valores, por exemplo, se existir um Produto com id 1 e uma Promocao com id 1 um vai sobrepor o outro, teria uma maneira de não deixar isso acontecer?

Obrigado!

solução!

Conceitualmente acho meio estranho você querer juntar as Collections e manter as keys, pois estaria inventando informações. Não sei o histórico do seu projeto mas eu usaria mesmo as tabelas relacionais. Enfim, uma solução simples é assim:

No controller, crie uma Collection:

$tudo = new Collection();

Em seguida você faz foreach nos dois Produtos e Promocoes com um push():

$tudo->push($item)

Esse $item é o ponteiro atual no foreach ($produtos as $item)

Depois um orderBy created_at. Joga pra view só o $tudo e consome lá essa Collection.

@RICARDO AUGUSTO DO CARMO Consegui fazer, vlw =D

Não respondi antes pq estava fazendo outra parte do site, vlw!