【发布时间】:2016-04-10 01:27:12
【问题描述】:
按照此 laracast 中的说明进行操作:
https://laracasts.com/series/laravel-5-fundamentals/episodes/21
我创建了一个 Channel 模型
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
}
}
所以通过数据透视表在 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 框架版本 5.2.6 和 PHP 5.6.16
【问题讨论】:
-
$tag 变量尚未引用通道。试试
$channel->tags()->channels -
或者你可能需要
$tag->load('channels')->channels->toArray(); -
好的,我看到了这个错误。它是
belongsToMany。你错过了s -
在课堂上标记此行
return $this->belongToMany('App\Channel'); //channel_id
标签: php laravel laravel-5 php-5.6 laravel-5.2