2016-07-26 1 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 линии: Вызов неопределенной метод Осветите \ Database \ Eloquent \ Коллекция :: присоединять()

Я установил отношения многие ко многим между статьями и теги, также правильно добавленным миграции.

Но когда я пытаюсь добавить статью с помощью тега, я получаю ошибку. Позвольте мне знать, что не так с моим кодом. Что-то не хватает в установлении отношений.

Кроме того, это перемещение файла таблицы

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

Вызов метода отношения, с другой стороны, возвращает экземпляр отношений, в вашем случае - BelongsToMany , attach() способ входит в состав BelongsToMany класс.

Смежные вопросы