Laravel有很多方法无效

时间:2016-01-02 23:53:57

标签: php laravel laravel-5 eloquent

我有2个表,userswebsites。一个用户可以分配多个网站。

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

};

2 个答案:

答案 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;
}

上述两个选项都会返回相同的内容:CollectionWebsite个对象。由于您从控制器返回此值,因此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);
}

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

};