0

J'ai 3 tables dans DB (utilisateurs, zones, area_user),propriété [nom] n'existe pas sur cette instance de collection

Table des utilisateurs: id nom nom d'utilisateur mot de passe

table zones: id nom

table area_user: id user_id area_id

J'essaie de créer une page (Liste des utilisateurs) qui affichera toutes les colonnes de la table utilisateur avec les zones affectées par l'utilisateur.

User.php fichier Modèle

<?php 

namespace App; 

use Illuminate\Notifications\Notifiable; 
use Illuminate\Foundation\Auth\User as Authenticatable; 

class User extends Authenticatable{ 
    use Notifiable; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['name', 'email', 'password','role_id',]; 

    /** 
    * The attributes that should be hidden for arrays. 
    * 
    * @var array 
    */ 
    protected $hidden = ['password', 'remember_token',]; 

    public function areas(){ 
     return $this->belongsToMany('App\Area','area_user'); 
    } 

Area.php fichier Modèle:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Area extends Model{ 
    protected $fillable = ['name']; 

    public function users(){ 
     return $this->belongsToMany('App\User','area_user','area_id','user_id'); 
    } 
} 

UserController fichier d'index @:

<?php 

namespace App\Http\Controllers; 

use App\Areas; 
use App\Roles; 
use App\User; 
use Illuminate\Http\Request; 

class UserController extends Controller{ 

    public function __construct(){ 
     // $this->middleware('auth'); 
    } 

    /** 
    * Display a listing of the resource. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function index(){ 
     $users = User::get(); 
     return view('users._list', 
     ['users'=> $users] 
    ); 
    } 

Enfin, le fichier de vue de la table: -

@foreach($users as $u) 
      <tr role="row" class="odd"> 
       <td class="sorting_1">{{$u->name}}</td> 
       <td></td> 
       <td>{{$u->areas]}}</td> 
       <td>{{route('show_user', ['id' => $u->id])}}</td> 
      </tr></tbody> 
@endforeach 

Si je tapais en vue de la table utilisateur (zones affectées) avec seulement en utilisant la propriété zones ($ U-> zones), il montrera toute la colonne des zones: -

[ 
    { 
    "id": 3, 
    "name": "C", 
    "location_id": 1, 
    "created_at": null, 
    "updated_at": null, 
    "pivot": { 
     "user_id": 4, 
     "area_id": 3 
    } 
    }, 
    { 
    "id": 4, 
    "name": "D", 
    "location_id": 2, 
    "created_at": null, 
    "updated_at": null, 
    "pivot": { 
     "user_id": 4, 
     "area_id": 4 
    } 
    } 
] 

@foreach($users as $u) 
       <tr role="row" class="odd"> 
        <td class="sorting_1">{{$u->name}}</td> 
        <td></td> 
        <td>{{$u->areas->name]}}</td> 
        <td>{{route('show_user', ['id' => $u->id])}}</td> 
       </tr></tbody> 
    @endforeach 

Notez que si je spécifie le nom de la colonne dans la relation Areas dans la vue ci-dessus ($ u-> areas-> name), erreur indiquant: -

La propriété [nom] n'existe pas sur cette instance de collection. (Voir: C: \ xampp \ htdocs

Comment puis-je montrer que la (areas.name) colonne vue fichier

Répondre

1

Parce que le areas est une collection vous devriez donc en boucle sur elle comme ceci:

@foreach($users as $u) 
    <tr role="row" class="odd"> 
     <td class="sorting_1">{{$u->name}}</td> 
     <td></td> 
     <td> 
     @foreach($u->areas as $area) 
      {{$area->name}}, 
     @endforeach 
     </td> 
     <td>{{route('show_user', ['id' => $u->id])}}</td> 
    </tr></tbody> 
@endforeach 

Et si vous voulez les séparer cinque com ma, par exemple, vous pouvez le faire comme ça sans boucle:

@foreach($users as $u) 
    <tr role="row" class="odd"> 
     <td class="sorting_1">{{$u->name}}</td> 
     <td></td> 
     <td> 
      {{ $u->areas->pluck('name')->implode(', ') }} 
     </td> 
     <td>{{route('show_user', ['id' => $u->id])}}</td> 
    </tr></tbody> 
@endforeach 
2

Comme il est un nombre à plusieurs, vous ne pouvez pas afficher uniquement les zones propriété . vous devez itérer sur les zones:

@foreach($users as $u) 
    @foreach ($u->areas as $area) 
     {{ $area->name }} 
    @endforeach 
@endforeach 
+1

Merci, qui a résolu le problème, les zones maintenant est montrant comme supposé. – user2873860

1

Comme toutes les réponses mentionnées, areas est une collection.

Vous pouvez concaténer les noms avec <td>{{ $user->areas->pluck('name')->implode(' ') }}</td>