Попытка отсортировать и получить сбор данных - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь получить данные пользователей из таблицы users, передав идентификатор из reports таблицы
Я хочу отобразить reason имя reported_user и имя reported_by
, когда я запускаю dd($report->all());, он показывает следующее: -

array:2 [▼
  0 => App\Report {#1057 ▼
    #fillable: array:3 [▼
      0 => "reported_by"
      1 => "reported_user"
      2 => "reason"
    ]
    #connection: "sqlite"
    #table: "reports"
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:6 [▶]
    #original: array:6 [▶]
    #changes: []
    #casts: []
    #classCastCache: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: []
    #touches: []
    +timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [▶]
  }
  1 => App\Report {#1056 ▶}
]

Я тоже сталкиваюсь с этой ошибкой: -
Свойство [report_user] не существует на этом экземпляр коллекции.
и то же самое для $reportedBy

Вот мой контроллер

public function reports()
    {
        $report = Report::all();

        $reportedUser = DB::table('users')
        ->where('id', '=', $report->reported_user)
        ->get();

        $reportedBy = DB::table('users')
        ->where('id', '=', $report->reported_by)
        ->get();



        return view('admin.report', compact('report'));
}

Вот моя таблица отчетов: -

public function up()
    {
        Schema::create('reports', function (Blueprint $table) {
            $table->id();
            $table->integer('reported_by')->unsigned();
            $table->integer('reported_user')->unsigned();
            $table->string('reason');
            $table->timestamps();
        });
    }

Может ли кто-нибудь сказать мне, является ли это правильным способом выполнения этой задачи и почему я получаю такую ​​ошибку.

1 Ответ

1 голос
/ 17 июня 2020

Вы пытаетесь нарисовать свойство из коллекции, а не из одного экземпляра объекта.

Коллекция $report - это не отдельный объект, это набор отчетов. Каждый отчет в этой коллекции будет иметь свойство reported_user, но не коллекцию в целом.

Чтобы исправить это, вы можете либо получить один отчет из БД:

 $report = Report::first();

, где у вас будет доступ к полю reported_user для этого объекта, или вы можете oop в отчетах, которые вы составили из исходной коллекции :

foreach($report as $r){
  $reportedUser = DB::table('users')
    ->where('id', '=', $r->reported_user)
    ->first();
 }

Предложите назвать исходную коллекцию отчетов как $reports, чтобы избежать путаницы и показать, что это коллекция, а не отдельный объект отчета.

Также - обратите внимание, что я сделал то же самое в l oop - захватите объект, а не коллекцию, используя метод first(), вместо get().

EDIT :

Выше был простой пример для объяснения . Чтобы предотвратить множество вызовов БД, вы также можете сделать это:

$reports = Report::pluck('reported_user');

$reportedUsers = DB::table('users')
   ->whereIn('id', $reports)
   ->get();

Теперь у вас есть коллекция всех reported_user с полной детализацией. Затем вы можете l oop на этой $reportedUsers коллекции и получить детали каждой из них.

...