Следуя инструкциям в этом ларакасте:
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('Ym-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 } }
так что есть много-ко-многим betweeen Channel и Tag через сводную таблицу.
Мои миграции выглядят следующим образом
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'); } }
Однако, когда я использую artisan tinker для подключения канала к тегу следующим образом:
==> 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