Вложенный foreach в Laravel двумя разными моделями

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

Trying to get property of non-object (View: 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'));

Вид

@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 ($ choices) перед 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

Пожалуйста, сбросьте свою переменную перед запуском цикла и проверьте результат. Для этого вы можете использовать функцию laravel dd($variable).

srimaln91 25.06.2018 04:45

когда я dd($choices), он дает мне правильные данные.

Ruka Xing 25.06.2018 04:47

Пожалуйста, проверьте мой обновленный вопрос. @ srimaln91

Ruka Xing 25.06.2018 04:48

Ваш цикл foreach выглядит правильно. Но ваш dd($choices) возвращает только массив целых чисел, в то время как вы пытаетесь получить к нему доступ, как $choice->question_number. Попробуйте изменить его только на {{ $choice }} в цикле выбора foreach.

Joshua Stephen 25.06.2018 04:51

@JoshuaStephen такая же ошибка, сэр.

Ruka Xing 25.06.2018 04:52

пожалуйста, добавьте к вашему вопросу метод topic и topic.choices.

Alihossein shahabi 28.06.2018 23:01

В вашей логике есть несколько ошибок: 1) вы хотите связать темы и варианты выбора, но не так ясно, как, возможно, вам следует использовать отношения, и 2) ошибка, которую вы получаете, связана с тем, что $ choice находится вне контекста, вне вашего внутренний цикл. Укажите, чего вам нужно достичь.

Marco Cazzaro 02.07.2018 18:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
7
1 593
5

Ответы 5

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

$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

хотите добавить объяснение?

Wreigh 25.06.2018 09:20

Хорошие новости Практически работает, зациклил данные. но плохие новости. Я зациклил данные для каждой строки. Это как будто я распечатал все data в столбце 1, а также распечатал все data в столбце 2.

Ruka Xing 25.06.2018 09:37

Не могли бы вы объяснить, что именно вы хотите? и если это сработает для вас, примите ответ.

Mayuri Pansuriya 25.06.2018 09:44

Я хочу коллекцию foreach 2 в 1 foreach. это как. @foreach ($duplicates as $duplicate) и {{ $duplicate->topic->id }} и {{ $choice->question_number }}

Ruka Xing 25.06.2018 10:13

Вы можете использовать отношение для выбора в самом первом запросе, например with(['choice' => function($q) { $q->where('user_id',Auth::id()); });

Mayuri Pansuriya 25.06.2018 11:07

1 решение

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

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

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

Из{{ $choice->question_number }}

К{{ $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

Я хочу использовать 2 коллекции в 1 foreach. пожалуйста помоги. тогда позвольте мне принять ваш ответ.

Ruka Xing 02.07.2018 11:30

Да, ты можешь. есть ли связь между моделью вопроса и моделью выбора? Кажется, что у вас есть? Кажется, что у него есть тема, а затем выбор, поэтому у темы есть одна реализация с выбором или есть много?

DsRaj 03.07.2018 06:30

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

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

поэтому, на ваш взгляд, вы не можете использовать $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>

В вашем контроллере не используйте 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'));

Вид

@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 () в коллекции и оставьте ее как объект или используйте синтаксис массива.

В foreach выдает ошибку типа Array to string conversion

Ruka Xing 03.07.2018 04:22
просмотреть модель контроллера?
Ruka Xing 03.07.2018 04:24

Обновил свой ответ. Суть в том, что вам нужно анализировать одно с той же скоростью, что и другое. Как уже упоминал кто-то другой, я думаю, вам следует подумать о создании отношения в своей модели, чтобы вы могли получить все, что вам нужно, в одном запросе. Вы также должны использовать get () вместо pluck, поскольку вы используете id и question_number.

OneLiner 03.07.2018 04:38

Позвольте нам продолжить обсуждение в чате.

OneLiner 03.07.2018 04:40

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

Другие вопросы по теме