У меня есть 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); }
Имеют ли ваши модели правильное пространство имен?
namespace App\Models;
Вы могли бы попробовать еще 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(); } };