我有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');
}
};
答案 0 :(得分:11)
websites()
函数本身不会导致错误。错误来自您使用该功能的任何地方。
hasMany()
函数返回Illuminate\Database\Eloquent\Relations\HasMany
个对象。因此,当您致电$user->websites()
时,这将返回HasMany
关系对象。无论您在何处使用此功能,您都会尝试将该结果转换为字符串,这是您所看到的错误。
例如:
$user = User::find(1);
echo $user->websites();
在此示例中,如果您尝试echo
来自websites()
方法的响应,您将得到&#34;无法转换为字符串&#34;错误。
如果这对您没有足够的帮助来解决问题,则需要发布调用websites()
函数的代码,以便任何人能够进一步提供帮助。
&#34;控制器没有回显website()方法,它只返回它。&#34;控制器方法返回的任何内容都将转换为字符串。这是你的问题。
您需要返回HasMany
对象的结果,而不是返回HasMany
对象。有两个主要选项:在关系上调用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 Website
对象的json数组。
答案 1 :(得分:3)
我有几个可能的解决方案:
首先,您是否定义了反向关系?
<强> 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
。
注意如果你想要一个更干净的界面,你可以使用&gt; = 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;
你可以尝试另外两件事。
<?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();
}
};