Создать PHPExcel Laravel Excel с отношениями «многие ко многим»

Я работаю над приложением для экзаменов/викторин, и оно создает тесты/викторины для пользователей, и теперь я должен создать набор электронных таблиц, содержащих такие данные, как присутствующие студенты на данном экзамене, таблицы оценок и так далее.

Но до сих пор все, что мне удалось создать, это лист со ВСЕМИ пользователями, использующими `-> fromModel', но если я использую какое-либо отношение и/или ограничение, я получаю пустой лист.

У меня есть эти модели:

 <?php

namespace EMMA5;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class Exam extends Model
{
    //

    protected $dates = ['created_at', 'updated_at', 'applicated_at'];

    protected $fillable = [
        'applicated_at',
        'duration',
        'board_id',
        'passing_grade',
        'annotation'
   ];

    public function board()
    {
        return $this->belongsTo('EMMA5\Board');
    }

    public function users()
    {
        return $this->belongsToMany('EMMA5\User')->withPivot('active', 'started_at', 'ended_at', 'seat', 'location_id');
    }

... Пользовательская модель (сокращенно) class User extends Authenticatable { ... //Отношения public functionanswers() { return $this->hasMany(Answer::class); }

    public function exams()
    {
        return $this->belongsToMany('EMMA5\Exam')->withPivot('active', 'started_at', 'ended_at', 'location_id');
    }

...

И я пытаюсь создать лист с пользователями для данного экзамена: (Это из моего ExamController.php)

/**
     * Returns a spreadsheet with only the students that were present
     *
     * @return PHPOffice
     */
    public function gradesSpreadshet(Exam $exam)
    {
            $grade = new Grade;
            $gradedStudents = $grade->allStudents($exam)->toArray();
            //dd(\EMMA5\Exam::find(195)->with('users')->get());
            //dd($exam->answers->answer);
            $data = $exam->users;
            return Excel::create("FinalGrades", function ($excel) use($data) {
                    //Create sheet to be able to return something to keep on testing

                    //Another sheet
                    $excel->sheet('Primera hoja', function ($sheet) use($data) {
                            $sheet->fromArray($data);
                    });
            })->export('xlsx');
    }

И я получаю пустой лист. Я уже пробовал с ->fromArray() и ->fromModel() . Будем признательны за любой вклад.


person Marco Santana    schedule 03.08.2017    source источник


Ответы (1)


Прошло некоторое время, и никто не ответил, но я нашел решение. Я не знаю, будет ли это полезно для кого-то еще.

То, как я получил результаты, не могло быть прочитано Excel Laravel. Поэтому я создал вспомогательную функцию с обратным вызовом.

public static function collectionToArray(Array $collect = null) { return array_map(function ($array) use($collect) { foreach ($array as $key => $value) { $resultArray[$key] = $value; } return $resultArray; }, $collect); } Это возвращает упрощенную версию коллекции, которую может легко прочитать Excel Laravel.

person Marco Santana    schedule 10.08.2017