Laravel вложенный foreach двумя разными моделями - PullRequest
0 голосов
/ 25 июня 2018

я пробовал это . Проблема в том, как получить данные из разных моделей?

Попытка получить свойство необъекта (Представление: C: \ wamp64 \ www \ zainsurgalt \ resources \ views \ choices \ index.blade.php)

Контроллер

$duplicates = Question::selectRaw("count('id') as total, topic_id")->with('topic', 'topic.choices')->groupBy('topic_id')->get();
$choices = Choice::where('user_id',Auth::id())->pluck('question_number')->toArray();
return view('choices.index',compact('duplicates','choices'));

View

@foreach ($duplicates as $duplicate)
        <tr>
            <td style="text-align: center;">{{ $duplicate->topic->id }}</td>
            <td style="text-align: center;">{{ $duplicate->topic->title }}</td>
            <td style="text-align: center;">{{ $duplicate->total }}</td>
            <td style="text-align: center;">
                @foreach ($choices as $choice)
                    {{ $choice->question_number }}
                @endforeach
            </td>
            <td>
            <a class="btn btn-default" href="choices/{{ $choice->id }}/edit">Шинэчлэх</a></td>
        </tr>
    @endforeach

результат dd ($ выборы) перед foreach

array:34 [▼
0 => 5
1 => 5
2 => 0
3 => 0
4 => 0
...
31 => 0
32 => 0
]

Добавлен полный код этого контроллера

public function index(Choice $choice){

    $duplicates = Question::selectRaw("count('id') as total, topic_id")->with('topic', 'topic.choices')->groupBy('topic_id')->get();
    $choices = Choice::where('user_id',Auth::id())->pluck('question_number');
    $user = Choice::where('user_id','=',Auth::id())->first();
    if ($user === null) {
        $too = 0;
        return redirect()->route('choices.create');
    }
    else{
        $too = 1;
        return view('choices.index',compact('too','duplicates','choices'));
    }
}

Полный код вида

<table align="center" border="1" cellpadding="1" cellspacing="1" style="height:106px; width:100%">
    <thead>
        <tr>
            <th colspan="5" scope="col">
            <h3 style="text-align: center;"><b>Шалгалтын цаг сонголт</b></h3>
            <select style="text-align: center;" name="time" class="form-control"> 
                    <option value="30:01">30 минут</option>
                    <option value="40:01">40 минут</option>
                    <option value="50:01">50 минут</option>
                    <option value="60:01">60 минут</option>
                    <option value="70:01">70 минут</option>
                    <option value="80:01">80 минут</option>
                    <option value="90:01">90 минут</option>
            </select></th>
        </tr>
        <tr>
            <th style="text-align: center;" scope="col">№</th>
            <th style="text-align: center;" scope="col">Нэр</th>
            <th style="text-align: center;" scope="col">Нийт асуултын тоо</th>
            <th style="text-align: center;" scope="col">Асуултын тоо</th>
            <th scope="col"></th>
        </tr>
    </thead>
    <tbody>
    @foreach (array_combine($duplicates->toArray(), $choices->toArray()) as $duplicate => $choice){
        <tr>
            <td style="text-align: center;">{{ $duplicate->topic->id }}</td>
            <td style="text-align: center;">{{ $duplicate->topic->title }}</td>
            <td style="text-align: center;">{{ $duplicate->total }}</td>
            <td style="text-align: center;">{{ $choice->question_number }}</td>
            <td><a class="btn btn-default" href="choices/{{ $choice->id }}/edit">Шинэчлэх</a></td>
        </tr>
    @endforeach
    </tbody>
</table>

brwanobr oawnbrnoawbn obrawnor bonb rwanobrwn obrawnobrw aonbanobnaowbonwab onbonawb onrwa onbr awnob rwnobrno rbawnorb noawbnorba nobrwaonbrwa

Ответы [ 5 ]

0 голосов
/ 05 июля 2019

Лучше Объедините все эти таблицы и сохраните их в одной переменной. Затем передайте соединения в представлении с помощью метода compact () для контроллера. Затем выполните foreach, сохранив одну переменную. Это сделает вас более чистым и лучше.

0 голосов
/ 03 июля 2018

В вашем контроллере не используйте toArray (), если вы хотите, чтобы оба элемента были объектами. Лучший из известных мне способов сделать это в представлении - использовать array_combine (), если объекты имеют одинаковую длину.

Контроллер

$duplicates = Question::selectRaw("count('id') as total, topic_id")->with('topic', 'topic.choices')->groupBy('topic_id')->get()->toArray();
$choices = Choice::where('user_id',Auth::id())->get()->toArray();
return view('choices.index',compact('duplicates','choices'));

View

@for($i=0; $i< count($duplicates); $i++){
   <tr>
        <td style="text-align: center;">{{ $duplicates[$i]['topic']['id'] }}</td>
        <td style="text-align: center;">{{ $duplicates[$i]['topic']['title'] }}</td>
        <td style="text-align: center;">{{ $duplicates[$i]['total'] }}</td>
        <td style="text-align: center;">{{ $choices[$i]['question_number'] }}</td>
        <td><a class="btn btn-default" href="choices/{{ $choices[$i]['id'] }}/edit">Шинэчлэх</a></td>
    </tr>
@endfor

Ошибка, которую вы показали при попытке доступа к массиву с использованием синтаксиса объекта:

{{ $choice->question_number }}

$choices = Choice::where('user_id',Auth::id())->pluck('question_number');

Если это единственная проблема, просто не используйте toArray () для коллекции и оставьте ее как объект или используйте синтаксис массива.

0 голосов
/ 29 июня 2018

1 решение

Вы используете идентификатор выбора в блейд-файле, но в запросе вы не загружаете идентификатор. Поэтому необходимо загрузить оба идентификатора и номер вопроса *

$choices = Choice::where('user_id',Auth::id())->get(['id','question_number'])->toArray();

Также, когда вы используете toArray () , вам необходимо изменить

С {{ $choice->question_number }}

TO {{ $choice['question_number'] }}

то же самое для ссылки редактирования вариантов href="choices/{{ $choice['id'] }}/edit"

Или просто удалите toArray() из запроса.

2 решение

Теперь, если вы хотите загрузить выбор вместе с темой и у вас есть идентификатор темы в модели выбора

$duplicates = Question::selectRaw("count('id') as total, topic_id")->with('topic', 'topic.choices')->groupBy('topic_id')->get(); // Id for this table is your question number or any realtion between the Question Model and Choice Model
$choices = Choice::where('user_id',Auth::id())->pluck('question_number','topic_id')->toArray();
return view('choices.index',compact('duplicates','choices'));


@foreach ($duplicates as $duplicate)
    <tr>
        <td style="text-align: center;">{{ $duplicate->topic->id }}</td>
        <td style="text-align: center;">{{ $duplicate->topic->title }}</td>
        <td style="text-align: center;">{{ $duplicate->total }}</td>
        <td style="text-align: center;">
             {{ isset($choices[$duplicate->topic->id]) ? $duplicate->topic->id : '' }}
        </td>
        <td>
        <a class="btn btn-default" href="choices/{{ isset($choices[$duplicate->topic->id]) ? $choices[$duplicate->topic->id] : '' }}/edit">Шинэчлэх</a></td>
    </tr>
@endforeach
0 голосов
/ 02 июля 2018

пытается получить доступ к $choice->id из цикла foreach по вашему мнению

вы использовали pluck () в вашем контроллере

так что по вашему мнению вы не можете использовать $choice->question_number

так что вам нужно сменить контроллер запрос или вы можете использовать ниже

@foreach ($duplicates as $duplicate)
  @foreach ($choices as $choice)
  // here only can use like this
      {{ $choice }}
      //{{ $choice->question_number }}
    @endforeach           

// this $choice->id out of foreach loop
<a class="btn btn-default" href="choices/{{ $choice->id }}/edit">Шинэчлэх</a></td> 
@endforeach

или, как сказал @Mayuri Pansuriya, вам нужно изменить запрос контроллера, тогда вы сможете получить доступ к

$choices = Choice::where('user_id',Auth::id())->get();

тогда вы можете получить доступ в вашем представлении

<td style="text-align: center;">
       @foreach ($choices as $choice)
           {{ $choice->question_number }}
       @endforeach
</td>
0 голосов
/ 25 июня 2018

Попробуйте заменить

$choices = Choice::where('user_id',Auth::id())->pluck('question_number')->toArray();

на $choices = Choice::where('user_id',Auth::id())->get();, так как когда вы выдернете, вы не получите ключ question_number и получите ошибку trying t o get property of undefined

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...