J'ai un soucis de relation n+1 sur $note->user->name,
bien que je rajoute with('user') dans mon controller, cela ne resoud rien et deplus, le trie ne fonctionne pas, comme si tout les changements n'avait aucun impact

// NoteController
  public function index(Request $request, Project $project)
    {
        $notes = Note::with('user')->orderByDesc('created_at')->get();
        return view('note.index', compact('notes', 'project'));
    }

//vue
@foreach ($project->notes as $note)
    <tr>
        <td>
            {{ $note->id }}
        </td>
        <td>
            {{ $note->user->name }}
        </td>
        <td>
            {!! $note->content !!}
        </td>
    </tr>
@endforeach

Ce que je veux

n+1 et trier la liste par date

Ce que j'obtiens

rien, toujours un soucis de n+1 et le trie ne fonctionne pas

6 réponses


sylvain
Auteur

Pour le probleme de tri sur les notes par date, je l'ai résolu en parti

si je rajoute dans le model, un tri sur la relation notes,
ca marche, mais je ne veux pas forcement trier tout le temps

// model Project

 public function notes()
    {
        return $this->hasMany(Note::class)->orderByDesc('created_at');
    }

Dans chaque $note->user tu fais une relation entre user et name
Ce que tu peux essayer ce serait de récupérer directement le name:

$notes = Note::with('user.name')->orderByDesc('created_at')->get();
sylvain
Auteur

j'ai un joli

Call to undefined relationship [name] on model [App\Models\User].

dans mon model Note, j'ai renseigné

public function user()
{
   return $this->belongsTo(User::class);
}

dans le model User

public function notes()
{
   return $this->hasMany(Note::class);
}

je vois pas trop quel relation, il manque du coup

Ah oui, dans user faut une function name
En gros avec user.name laravel va chercher le model user, et ensuite lancer la function name (qui devra retourner $this->name)

Bonjour pour le tri tu pourrais faire ceci


$notes = Note::with(['user' => function($builder){
    $builder->orderByDesc('created_at);
}])->get();

Salut,

Dans ta vue, tu boucles sur $project->notes alors que ton with et ton orderByDesc sont bindés sur $notes que tu n'utilies pas dans ta vue.