Laravel hasMany не работает

У меня есть 2 таблицы, users и websites . Один пользователь может иметь несколько сайтов, назначенных ему.

 public function websites() { return $this->hasMany('App\Models\Website'); } 

Ошибка, которую я получаю:

Object of class Illuminate\Database\Eloquent\Relations\HasMany could not be converted to string

Если я попытаюсь вывести его как массив, используя print_r я получаю сотни строк массива, которые, как я предполагаю, вызваны ошибкой где-то.

Кроме того, почему я должен использовать App\Models\Website в методе hasMany если я указал в верхней части модели User use App\Models\Website; ?

Если я использую только Website в методе, я получаю класс не найденной ошибки:

Class 'Website' not found

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

Код в контроллере:

 <?php namespace App\Http\Controllers; use DB; use App\User; class DashboardController extends Controller { /*------------------------------------------------------------------ Dashboard page -------------------------------------------------------------------*/ public function show() { //$user = auth()->user(); $user = User::find(5); return $user->websites(); //return view('dashboard'); } }; 

Сама функция websites() не вызывает ошибку. Ошибка исходит от того, где вы используете эту функцию.

Функция hasMany() возвращает объект Illuminate\Database\Eloquent\Relations\HasMany . Поэтому, когда вы вызываете $user->websites() , это возвращает HasMany отношений HasMany . Где бы вы ни использовали эту функцию, вы затем пытаетесь преобразовать этот результат в строку, которая является ошибкой, которую вы видите.

Например:

 $user = User::find(1); echo $user->websites(); 

В этом примере, если вы попытаетесь echo ответ с помощью метода websites() , вы получите сообщение «не может быть преобразовано в строку».

Если это не поможет вам решить проблему, вам нужно будет опубликовать код, вызывающий функцию websites() чтобы кто-нибудь мог помочь.

редактировать

«Контроллер не повторяет метод websites (), он просто возвращает его». Все, возвращаемое методом контроллера, преобразуется в строку. Это ваша проблема.

Вместо того, чтобы возвращать объект HasMany , вам нужно вернуть результаты объекта HasMany . Существуют два основных варианта: call get() в отношении, чтобы фактически получить результаты и вернуть их, или использовать атрибут отношения вместо метода.

Опция 1:

 public function show() { $user = User::find(5); // call "get()" to get the results return $user->websites()->get(); } 

Вариант 2:

 public function show() { $user = User::find(5); // use lazy loaded attribute instead of using relationship method return $user->websites; } 

Оба вышеперечисленных варианта вернут то же самое: Collection объектов Website . Поскольку вы возвращаете это из контроллера, Laravel преобразует его в строку, поэтому ваш вывод будет json-массивом объектов json Website .

У меня есть несколько возможных решений:

Во-первых, у вас есть обратная взаимосвязь?

User.php

 public function websites() { return $this->hasMany('App\Models\Website'); } 

Website.php

 public function user() { return $this->belongsTo('App\Models\User'); } 

Во-вторых, вы запустили composer dump-autoload в терминале.

Обратите внимание, если вы хотите использовать более чистый интерфейс, если вы используете> = php 5.5

User.php

 public function websites() { return $this->hasMany(App\Models\Website::class); } 

или

 use App\Models\Website; public function user() { return $this->hasMany(Website::class); } 

Редактировать 1

Имеют ли ваши модели правильное пространство имен?

 namespace App\Models; 

Изменить 2

Вы могли бы попробовать еще 2 вещи.

 <?php namespace App\Http\Controllers; use DB; use App\User; class DashboardController extends Controller { public function show() { $user = User::find(5); return $user->websites()->toArray(); } // this one will query the database only once. public function newShow() { $user = User::with('websites')->find(5); return $user->websites->toArray(); } };