Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔有许多方法不起作用_Php_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Php 拉威尔有许多方法不起作用

Php 拉威尔有许多方法不起作用,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我有两个表,用户和网站。一个用户可以为其分配多个网站 public function websites() { return $this->hasMany('App\Models\Website'); } 我得到的错误是: 类的对象Illumb\Database\Eloquent\Relations\HasMany无法转换为字符串 如果我尝试使用print\r将其输出为一个数组,我会得到数百行数组,我假设这是由某个错误引起的 另外,如果我在Usermodeluse App\Mod

我有两个表,
用户
网站
。一个用户可以为其分配多个网站

public function websites() {
    return $this->hasMany('App\Models\Website');
}
我得到的错误是:

类的对象Illumb\Database\Eloquent\Relations\HasMany无法转换为字符串

如果我尝试使用
print\r
将其输出为一个数组,我会得到数百行数组,我假设这是由某个错误引起的

另外,如果我在
User
model
use App\Models\Website的顶部指定,为什么我必须在
hasMany
方法中使用
App\Models\Website

如果我在方法中仅使用
网站
,我会得到类未找到错误:

未找到类“网站”

这没什么大不了的,但是不必使用完整的名称空间路径会更干净

控制器中的代码:

<?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');
    }

};

我有两种可能的解决方案:

首先,是否定义了反向关系

User.php

public function websites() {
    return $this->hasMany('App\Models\Website');
}
public function user()
{
    return $this->belongsTo('App\Models\User');
}
public function websites() {
    return $this->hasMany(App\Models\Website::class);
}
Website.php

public function websites() {
    return $this->hasMany('App\Models\Website');
}
public function user()
{
    return $this->belongsTo('App\Models\User');
}
public function websites() {
    return $this->hasMany(App\Models\Website::class);
}
其次,您是否在终端中运行了
composer dump autoload

注意:如果您想要一个更干净的界面,您可以在使用>=PHP5.5时使用它

User.php

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

编辑1 您的模型是否具有正确的命名空间

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();
    }

};
功能本身没有导致错误。错误来自您使用该函数的任何地方

hasMany()
函数返回一个
illighte\Database\Eloquent\Relations\hasMany
对象。因此,当您调用
$user->websites()
时,将返回
HasMany
关系对象。无论您在何处使用此函数,都会尝试将结果转换为字符串,这就是您看到的错误

例如:

$user = User::find(1);
echo $user->websites();
在本例中,如果尝试从
websites()
方法回送
echo
响应,则会出现“无法转换为字符串”错误

如果这还不能帮助您解决问题,您需要发布调用
websites()
函数的代码,以便任何人能够提供进一步帮助

编辑 “控制器不回显websites()方法,它只是返回它。”控制器方法返回的任何内容都将转换为字符串。这是你的问题

您需要返回
HasMany
对象的结果,而不是返回
HasMany
对象。有两个主要选项:对关系调用
get()
,以实际获取结果并返回结果,或者使用relationship属性而不是方法

备选案文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;
}

上述两个选项将返回相同的内容:网站对象的
集合。由于您是从控制器返回的,Laravel会将其转换为字符串,因此您的输出将是json
Website
对象的json数组。

如果您不想引用关系中的完整名称空间,可以使用PHP5.5
::class
静态引用<代码>返回$this->hasMany(网站::类)。至于你的实际问题,你是如何利用这种关系的?你想达到什么目标
$user->websites
将返回结果的集合/数组,而
$user->websites()
将返回一个查询实例来查询属于该用户的网站。我只是尝试获取该用户拥有的所有网站。我可以让它像这样轻松工作
$websites=Website::where('user_id','=',$user->id)->get()
但是如果你愿意的话,我想使用清理过的方法,并且还想弄清楚为什么这个方法对我不起作用。你有没有故意把你的模型放在
App\models`?默认情况下,它们就在
App`中,因此您可以像
App\Website
一样引用它。此外,我认为您的网站表在名为
user\u id
的列中引用了拥有它的用户,因为您没有指定其他列?是的,我将所有模型都放在
App\models
中。
App
中只有一个是默认型号的User。稍后我可能会将其移动到
App\Models
。我没有定义反向关系,但我现在定义了,并且仍然返回相同的错误。我也甩了自动加载。同样,在您的回答中,文件应该重新设置,即
user
method应该在Website.php中,而
websites
method应该在user.php中。错误仍然返回,因为类的
对象照亮\数据库\雄辩\关系\有许多无法转换为字符串
对不起,我写得很快,我根据您的评论更新了我的答案。还添加了另一个想法。是的,我也有正确的名称空间。我可能只需要设置一个探查器库,以便查看更多详细信息,或者可能只需返回查询生成器,自己以这种方式获取数据,因为它肯定是这样工作的。@zen我想您正在尝试返回一个对象,php抱怨无法将对象转换为字符串。@whoacowboy您的第一个示例将出错,因为关系对象(例如
有许多
)没有实现
toArray()
方法。您的第二个示例可以工作,但有点多余,因为当集合转换为字符串时,
toArray
将在集合上被调用。控制器不响应websites()方法,只返回它。当我将其更改为
User::find(5)
时,我得到了相同的错误。如果我试图打印结果,它实际上会输出数百行(如果不是数千行的话)长的数组,这看起来更像是laravel系统的东西,而不是数据库中的任何东西。@zen我已经更新了答案以反映新的信息。我想问题确实不是调用get()方法。我刚刚添加了它,它返回t