2016-01-06 2 views
0

Следуя инструкциям в этом laracast:BadMethodCallException с сообщением 'Призыв к неопределенным метод Осветите Database Query Builder :: belongToMany()'

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 
    } 
} 

и модель Tag

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 Framework версии 5.2.6 и PHP 5.6.16

+0

переменной $ Тег не ссылаться на канал еще. Попробуйте '$ channel-> tags() -> channels' –

+0

или вам может понадобиться' $ tag-> load ('channels') -> channels-> toArray(); ' –

+1

Ок, я увидел ошибку. это 'принадлежит ToMany'. Вы пропустили 's' –

ответ

1

belongsToMany не belongToMany

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

Спасибо, что нашли эту опечатку. – Das