Как получить доступ к коллекции Laravel в цикле foreach в шаблоне лезвия? - PullRequest
0 голосов
/ 25 мая 2019

Я хочу получить информацию об имени пользователя из таблицы Users с автором id s из таблицы Pages.Для этого я сделал цикл foreach и добавил данные в массив users.

Это позволяет получить данные, но они неправильно отформатированы для использования в шаблоне блейда.Ниже приведен код:

$pages = \App\page::all();
    $users = array();
    foreach ($pages as $page) {
        $user = \App\user::where('id', $page->author)->get('name');
        $users[] = $user;
    }       
    dd($users);
    return view('admin.pages', compact('pages', 'users'));

Я вывел результаты с помощью метода dd($users) и получил это: image

Я использую этот код в шаблоне блейда для получения, но получаюпустое пространство в $users[$loop->index]->get('name') месте.

@foreach ($pages as $page)
            <tr>
              <th>{{ $page->id }}</th>
              <th>{{ $page->title }}</th>
              <th>{{ $users[$loop->index]->get('name') }}</th>
              @if($page->status = 'ACTIVE')
              <th><span class="label label-success">{{ $page->status }} </span></th>
              @elseif($page->status = 'DRAFT')
              <th><span class="label label-warning">{{ $page->status }} </span></th>
              @endif
              <th>{{ $page->Actions }}</th>
            </tr>
            @endforeach

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Вы не правильно определили свои отношения.App\User должно быть определено в модели:

public function pages()
{
    // have to specify the key name is author, not user_id
    return $this->hasMany("App\Page", "author");
}

А затем в модели App\Page это будет:

public function pageauthor()
{
    // have to specify the key name is author, not user_id
    return $this->belongsTo("App\User", "author");
}

Тогда в вашем шаблоне Blade вы просто ссылаетесь $page->author->name:

@foreach ($pages as $page)
            <tr>
              <th>{{ $page->id }}</th>
              <th>{{ $page->title }}</th>
              <th>{{ $page->pageauthor->name }}</th>
...
0 голосов
/ 25 мая 2019

Как-то так должно вам помочь

Ваш контроллер

$pages = \App\page::all();
foreach ($pages as $page) {
    $user = \App\user::find($page->author)->pluck('name');
    if(isset($user)){
      $page['user_name'] = $user->name;
    } else {
       $page['user_name'] = 'N/A';
     }
}
return view('admin.pages', compact('pages'));

Ваш взгляд

    @foreach ($pages as $page)
            <tr>
              <th>{{ $page->id }}</th>
              <th>{{ $page->title }}</th>
              <th>{{ $page->user_name) }}</th>
              @if($page->status = 'ACTIVE')
              <th><span class="label label-success">{{ $page->status }} 
    </span></th>
              @elseif($page->status = 'DRAFT')
              <th><span class="label label-warning">{{ $page->status }} 
</span></th>
               @endif
              <th>{{ $page->Actions }}</th>
            </tr>
            @endforeach

Чем код отличается от вашего текущего кода

1) записывает имя пользователя в основную коллекцию ($ pages), что позволяет вам беспокоиться о циклическом просмотре только одной коллекции в вашем представлении

2) он использует find() laravel, поскольку у страницы может быть только автор (я предполагаю) (Примечание: find() работает на основе вашего первичного ключа, в этом случае он будет искать в столбце id, который является наиболее столбец общего первичного ключа)

3) используется pluck()

0 голосов
/ 25 мая 2019

Вы можете использовать цикл foreach в контроллере для доступа к его атрибутам.

вот так

$users = \App\user::where('id', $page->author)->get('name');

$data = [];

foreach( $users as $user ){
        $data['name'] = $user['name'];       
   }

После этого передайте массив $ data в свой блейд-файл и получите имя доступа с помощью $ data ['name'];

...