2016-07-26 16 views
4

多対多の関係でlaravel 5を使用しています。 以下は私のコードです。Laravel 5定義されていないメソッドを呼び出す 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はでストア機能を使用してデータベースに保管しよう私は次のエラーに遭う。

ArticlesController.phpラインでFatalErrorException:\未定義のメソッドを照らし\ Databaseへの雄弁\コレクションを呼び出し::添付()

私は記事とタグの間には多くの関係、また、適切に追加の移行に多くを設定しています。

しかし、タグを使用して記事を追加しようとするとエラーになります。 私のコードに何が間違っているか教えてください。関係を築くことに欠けているものは何ですか?

また、この移行テーブルファイル

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'); 
} 

} 

は私が私が関係属性($article->tags)は、すべてのCollectionを返します使用して、多くの関係に

答えて

0

を多くと仕事を添付するために何をすべきか知ってみましょうです記事に関連するタグこのCollectionにはattach()メソッドがありません。

リレーションシップメソッド($article->tags())を使用する必要があります。リレーションシップメソッドは、attach()メソッドを持つリレーションシップインスタンスを返します。

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

あなたは$article->tags()方法の代わりに、$article->tagsプロパティを呼び出す必要があります。

Laravelでは、プロパティ名の形で関係メソッドを呼び出すと、魔法のように関連するモデルをCollectionとして取得します。言い換えれば、これらの2行はLaravelに正確に同じことを意味:

$tags = $article->tags; 

そして:

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

の関係メソッドを呼び出すと、他の一方で、あなたのケースでは、リレーションシップ・インスタンスを返します - BelongsToManyattach()メソッドは、BelongsToManyクラスの一部です。

関連する問題