2016-07-26 99 views
4

我正在使用laravel 5来建立多对多的关系。 以下是我的代码。Laravel 5调用未定义的方法Illuminate Database Eloquent Collection :: attach()

Article.php

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Carbon\Carbon; 

class Article extends Model { 

protected $fillable = ['title', 'body', 'published_at', 'user_id']; 

protected $dates = ['published_at']; 

public function setPublishedArAttribute($date) 
{ 
    Carbon::createFromFormat('Y-m-d', $date); 
    $this->attributes['published_at'] = Carbon::parse($date); 
} 

public function scopePublished($query) 
{ 
    $query->where('published_at', '<=', Carbon::now()); 
} 

public function scopeUnpublished($query) 
{ 
    $query->where('published_at', '>', Carbon::now()); 
} 

public function user() 
{ 
    return $this->belongsTo('App\User'); 
} 

public function tags() 
{ 
    return $this->belongsToMany('App\Tag'); 
} 

} 

Tag.php

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Tag extends Model { 

protected $fillable = [ 
    'name' 
]; 

public function articles() 
{ 
    return $this->belongsToMany('App\Article'); 
} 

} 

ArticleController.php

namespace App\Http\Controllers; 
use App\Article; 
use App\Http\Requests; 
use App\Http\Controllers\Controller; 

use Request; 
use Carbon\Carbon; 
use Auth; 

class ArticlesController extends Controller { 

public function __construct() 
{ 
    $this->middleware('auth', ['except', 'index']); 
} 

public function index() 
{ 
    $articles = Article::latest('published_at')->published()->get(); 
    return view('articles.index', compact('articles')); 
} 

public function show(Article $article) 
{ 
    return view('articles.show', compact('article')); 
} 

public function create() 
{ 
    if(Auth::guest()){ 
     return redirect('articles'); 
    } 
    $tags = \App\Tag::lists('name', 'id'); 
    return view('articles.create', compact('tags')); 
} 

public function store(Requests\ArticleRequest $request) 
{ 
    $article = Auth::user()->articles()->create($request->all()); 
    $article->tags->attach($request->input('tags')); 
    \Session::flash('flash_message', 'Your article has been created!'); 
    Article::create($request->all()); 
    return redirect('articles'); 
} 

public function edit(Article $article) 
{ 
    return view('articles.edit', compact('article')); 
} 

public function update(Article $article, Requests\ArticleRequest $request) 
{  
    $article->update($request->all()); 
    return redirect('articles'); 
} 

} 

当我尝试创建文章,并在ArticleController使用存储功能将其存储在数据库我得到以下错误。

FatalErrorException在ArticlesController.php行:调用未定义的方法照亮\数据库\雄辩\收藏::连接()

我已经设置许多文章和标签之间一对多的关系,也适当补充迁移。

但是,当我尝试添加文章使用标签我得到错误。 让我知道我的代码有什么问题。设置关系中缺少任何东西。

而且这是迁移表文件

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

    Schema::create('article_tag', function(Blueprint $table){ 
     $table->increments('id'); 
     $table->integer('article_id')->unsigned()->index(); 
     $table->foreign('article_id')->references('id')->on('articles')->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('article_tag'); 
} 

} 

让我知道我应该怎么做才能让许多附加工作,许多关系

回答

0

使用关系属性($article->tags)将返回所有的Collection与文章相关的标签。这个Collection没有attach()方法。

您需要使用关系方法($article->tags())。关系方法返回关系实例,该实例具有attach()方法。

$article->tags()->attach($request->input('tags')); 
0

你需要调用$article->tags()方法,而不是$article->tags财产。

在Laravel中,调用属性名称形状的关系方法,神奇地将相关模型作为集合获取。换句话说,这两条线意味着Laravel同样的事情:

$tags = $article->tags; 

和:

$tags = $article->tags()->get(); 

调用关系的方法,在另一方面,返回一个关系实例,你的情况 - BelongsToManyattach()方法是BelongsToMany类的一部分。

相关问题