Я пытался это. проблема в том, как получить данные из разных моделей?
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
когда я dd($choices), он дает мне правильные данные.
Пожалуйста, проверьте мой обновленный вопрос. @ srimaln91
Ваш цикл foreach выглядит правильно. Но ваш dd($choices) возвращает только массив целых чисел, в то время как вы пытаетесь получить к нему доступ, как $choice->question_number. Попробуйте изменить его только на {{ $choice }} в цикле выбора foreach.
@JoshuaStephen такая же ошибка, сэр.
пожалуйста, добавьте к вашему вопросу метод topic и topic.choices.
В вашей логике есть несколько ошибок: 1) вы хотите связать темы и варианты выбора, но не так ясно, как, возможно, вам следует использовать отношения, и 2) ошибка, которую вы получаете, связана с тем, что $ choice находится вне контекста, вне вашего внутренний цикл. Укажите, чего вам нужно достичь.






Попробуйте заменить
$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
хотите добавить объяснение?
Хорошие новости Практически работает, зациклил данные. но плохие новости. Я зациклил данные для каждой строки. Это как будто я распечатал все data в столбце 1, а также распечатал все data в столбце 2.
Не могли бы вы объяснить, что именно вы хотите? и если это сработает для вас, примите ответ.
Я хочу коллекцию foreach 2 в 1 foreach. это как. @foreach ($duplicates as $duplicate) и {{ $duplicate->topic->id }} и {{ $choice->question_number }}
Вы можете использовать отношение для выбора в самом первом запросе, например with(['choice' => function($q) { $q->where('user_id',Auth::id()); });
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. пожалуйста помоги. тогда позвольте мне принять ваш ответ.
Да, ты можешь. есть ли связь между моделью вопроса и моделью выбора? Кажется, что у вас есть? Кажется, что у него есть тема, а затем выбор, поэтому у темы есть одна реализация с выбором или есть много?
пытается получить доступ к $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
Обновил свой ответ. Суть в том, что вам нужно анализировать одно с той же скоростью, что и другое. Как уже упоминал кто-то другой, я думаю, вам следует подумать о создании отношения в своей модели, чтобы вы могли получить все, что вам нужно, в одном запросе. Вы также должны использовать get () вместо pluck, поскольку вы используете id и question_number.
Позвольте нам продолжить обсуждение в чате.
Лучше объедините все эти таблицы и сохраните их в одной переменной. Затем передайте соединения в представлении с помощью compact () метода контроллера. Затем выполните foreach, сохранив одну переменную. Это сделает вас чистым и лучше.
Пожалуйста, сбросьте свою переменную перед запуском цикла и проверьте результат. Для этого вы можете использовать функцию laravel
dd($variable).