2 votes

Comment accéder à la relation définie dans la vue blade laravel 5.6

Je veux accéder à la relation définie dans ma vue blade et l'afficher, je fais comme ceci dans mon modèle de facture

public function users() {
    return $this->hasone('App\Client','id','client_id');
}

et ici dans le contrôleur de facture

 public function show(Invoice $invoice)
{
    $clients = Invoice::with('users')->get();
    return view('admin.invoices.show', compact('invoice', $invoice),compact('clients',$clients));
}

et enfin dans ma vue j'ai fait ceci

{{ $clients->users->first()->title }}

mais lorsque j'essaie de voir, j'obtiens cette erreur

Property [users] does not exist on this collection instance

lorsque je dd les $clients, j'obtiens des résultats dans la relation comme ci-dessous

 #relations: array:1 [▼
    "users" => Client {#309 ▼
      #fillable: array:14 [▶]
      #connection: "mysql"
      #table: null
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:17 [▼
        "id" => 1
        "title" => "شسی"

5voto

patricus Points 29429

get() retourne toujours une Collection, avec 0...N résultats. Avec cette ligne :

$clients = Invoice::with('users')->get();

$clients sera une Collection d'objets Invoice. La propriété users n'existe pas sur la Collection, elle existe sur chaque Invoice à l'intérieur de la Collection.

Assurez-vous de parcourir votre collection $clients et d'accéder à users sur les éléments individuels Invoice.


NB: Bien que ce ne soit pas votre problème principal ici, la remarque de @Joshua concernant les users est correcte. La relation hasOne renverra soit une instance de modèle si la relation existe, soit null si la relation n'existe pas. Je suggérerais également de changer le nom de users en user, et éventuellement d'ajouter une protection pour le cas où la relation n'existe pas :

@foreach($clients as $client)
    ...
        {{ $client->user->title ?? 'No Title' }}
    ...
@endforeach

2voto

Joshua Stephen Points 103

Supprimez l'appel à la méthode first(), vous n'en avez pas besoin car vous avez récupéré les utilisateurs en faisant :

{{ $clients->users->title }}

Notez que si vous voulez utiliser l'appel à first(), vous devriez changer la requête comme suit :

{{ $client->users()->first()->title }}

Remarquez la différence entre users et users() dans la récupération de la relation eloquent.

Aussi, étant donné que votre relation est hasOne, vous devriez changer users en user pour éviter toute confusion.

1voto

Colin Barstow Points 434

Vous retournez une collection de clients donc vous devez itérer à travers la collection.

Vous définissez une relation hasOne sur votre modèle client appelée utilisateurs. Tout d'abord, comme il s'agit d'une relation hasOne, vous devriez lui donner un nom approprié, dans ce cas juste user.

Vous pouvez également le définir de manière beaucoup plus propre :

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

Maintenant, votre deuxième problème est la façon dont vous essayez de récupérer cette relation.

Disons que vous transmettez une collection de clients à votre vue, quelque chose comme :

public function clients()
{
    $clients = Client::with('user')->get();
    return view('view.view.view', compact('clients');
}

Dans votre blade, vous devez maintenant itérer à travers vos clients pour obtenir leur relation user :

@foreach($users as $user)
    {{ $client->user->user_column_name }}
@endforeach

J'espère que cela vous aide.

N'oubliez pas d'essayer de rendre vos noms aussi faciles à comprendre que possible, oui ce projet peut être pour vos yeux seulement mais juste ce simple extrait de code devient obscur pour quelqu'un qui ne l'a jamais vu et comprend ce qui se passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X