Laravel pediu por um relacionamento


116

Estou revisando todos os comentários postados pelo autor de uma determinada postagem.

foreach($post->user->comments as $comment)
    {
        echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>";
    }

Isso me dá

I love this post (3)
This is a comment (5)
This is the second Comment (3)

Como eu ordenaria pelo post_id para que a lista acima seja ordenada como 3,3,5

Respostas:


247

É possível estender a relação com funções de consulta:

<?php
public function comments()
{
    return $this->hasMany('Comment')->orderBy('column');
}

[editar após comentário]

<?php
class User
{
    public function comments()
    {
        return $this->hasMany('Comment');
    }
}

class Controller
{
    public function index()
    {
        $column = Input::get('orderBy', 'defaultColumn');
        $comments = User::find(1)->comments()->orderBy($column)->get();

        // use $comments in the template
    }
}

Modelo de usuário padrão + exemplo de controlador simples; ao obter a lista de comentários, basta aplicar o orderBy () baseado em Input :: get (). (certifique-se de fazer alguma verificação de entrada;))


2
Alguém já sugeriu isso no fórum do Laravel, mas eu quero ser capaz de fazer isso no controlador para que eu possa escolher qual campo classificar com base na entrada do usuário. Talvez eu devesse ter deixado isso mais claro na pergunta.
PrestonDocks

Eu adicionei um segundo exemplo
Rob Gordijn

1
Obrigado Rob, você me colocou no caminho certo. A resposta real foi $ comments = User :: find (10) -> comments () -> orderBy ('post_id') -> get (); Parecia precisar do método get () para funcionar. Se você puder adicionar get () à sua resposta, marcarei como a resposta aceita.
PrestonDocks

2
Isso funciona bem se você estiver recuperando um único registro, mas se estiver recuperando vários registros, você vai querer algo mais na linha de stackoverflow.com/a/26130907/1494454
dangel

Se você usar o modo estrito mysql, que é o padrão no Laravel 5.4, f.ex, você receberá SQLSTATE [42000]: Erro de sintaxe ou violação de acesso: 1140 Mistura de colunas de GRUPO ...
Sabine

8

Eu acredito que você também pode fazer:

$sortDirection = 'desc';

$user->with(['comments' => function ($query) use ($sortDirection) {
    $query->orderBy('column', $sortDirection);
}]);

Isso permite que você execute uma lógica arbitrária em cada registro de comentário relacionado. Você poderia ter coisas lá como:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);

1
Não. Eu tentei isso, não funciona. Aqui está o meu caso: tenho duas tabelas ( appointmentse schedules), a consulta é simples: obter appointmentsordem por schedules. datetimedescendente. Eu tenho a solução adicionando uma nova coluna na tabela appointmentspara armazenar datetimeda tabela schedules. E agora só preciso fazer o pedido appointments. datetimeEu sei que não é o melhor método, mas resolve o problema. XD
Fendi Setiawan

Muito obrigado funcionou no meu caso foi incrível.
Pooria Honarmand
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.