BadMethodCallException,消息为“调用未定义的方法IlluminateDatabaseQue


BadMethodCallException with message 'Call to undefined method IlluminateDatabaseQueryBuilder::belongToMany()'

按照本 laracast 中的说明进行操作:

https://laracasts.com/series/laravel-5-fundamentals/episodes/21

我创建了一个渠道模型

class Channel extends Model
{
    //
    protected $fillable = [
        'title',
        'description',
        'published_at',
    ];
    public function scopePublished($query) {
        $query->where('published_at', '<=', Carbon::now());
    }
    public function setPublishedAtAttribute($date) {
        $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date);   
    }
    /*
    * Get the tags associated with the given Channel
    *
    */
    public function tags() {
        return $this->belongsToMany('App'Tag'); //tag_id
    }
}

和标记模型

class Tag extends Model
{
    //
    protected $fillable = [
        'name', 'description',
    ];
    /**
    * Get the channels associated with the given tag
    */
    public function channels() {
        return $this->belongToMany('App'Channel'); //channel_id
    }
}

因此,通过数据透视表,通道和标签之间存在多对多关系。

我的迁移如下所示

use Illuminate'Database'Schema'Blueprint;
use Illuminate'Database'Migrations'Migration;
class CreateChannelsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('channels', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('description');
            $table->text('url');
            $table->text('channelposter');
            $table->timestamp('published_at');
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('channels');
    }
}

use Illuminate'Database'Schema'Blueprint;
use Illuminate'Database'Migrations'Migration;
class CreateTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('description');
            $table->timestamps();
        });
        //channel_tag
        Schema::create('channel_tag', function(Blueprint $table) {
            $table->integer('channel_id')->unsigned()->index();
            $table->foreign('channel_id')->references('id')->on('channels')->onDelete('cascade');
            $table->integer('tag_id')->unsigned()->index();
            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
            $table->timestamps();
        });

    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tags');
        Schema::drop('channel_tag');
    }
}

但是,当我使用工匠修补匠将通道连接到标签时,如下所示:

==> php artisan  tinker
Psy Shell v0.6.1 (PHP 5.6.16 — cli) by Justin Hileman
>>> $channel=App'Channel::first();
=> App'Channel {#660
     id: 1,
     title: "Test1",
     description: "Test1",
     url: "",
     channelposter: "",
     published_at: "2016-01-06 02:54:20",
     created_at: "2016-01-06 02:54:20",
     updated_at: "2016-01-06 02:54:20",
   }
>>> $tag = new App'Tag;
=> App'Tag {#649}
>>> $tag->name = "Recommended";
=> "Recommended"
>>> $tag->description = "Recommended";
=> "Recommended"
>>> $tag->save();
=> true
>>> DB::select('SELECT * FROM channel_tag');
=> []
>>> $channel->tags()->attach(1);
=> null
>>> DB::select('SELECT * FROM channel_tag');
=> [
     {#658
       +"channel_id": 1,
       +"tag_id": 1,
       +"created_at": "2016-01-05 21:56:46",
       +"updated_at": "0000-00-00 00:00:00",
     },
   ]
>>> $tag->channels->toArray();
BadMethodCallException with message 'Call to undefined method Illuminate'Database'Query'Builder::belongToMany()'

这没有意义,感觉它可能是一个错误,但我不确定。我正在使用 Laravel 框架版本 5.2.6 和 PHP 5.6.16

belongsToManybelongToMany

public function channels()
{
    return $this->belongsToMany('App'Channel'); //channel_id
}