2016-07-28 3 views
1

Я пытаюсь associate мой Document модели текущего идентификатора из поля зрения, используя комментарий модели. Но после нажатия кнопки. Это всегда говорит.Использования адъюнкта() не будет работать (BadMethodCallException)

Призыв к неопределенным метод Осветите \ Database \ Query \ Builder :: адъюнкт()

CommentController

class CommentController extends Controller 
{ 

    public function postComments(Request $request, Document $document) 
    { 

     $this->validate($request, 
     [ 
      'comment' => 'required', 
     ]); 

     $document = Document::find($document); 

     $commentObject = new Comment(); 

     $commentObject->comment = $request->comment; 
     $commentObject->associate($document); 
     $commentObject->save(); 

     return redirect()->back(); 
    } 
} 

Я пытаюсь здесь, чтобы получить текущую id из модель из вида, поэтому я могу связать это в моем $commentObject.

DocumentController

//READ 
public function readDocuments($id) 
{ 
    //Find the document in the database and save as var. 
    $document = Document::find($id); 

    return view ('document.read')->with('document', $document); 
} 

маршруты

Route::get('/document/{id}', 
[ 
    'uses' => '\App\Http\Controllers\[email protected]', 
    'as' => 'document.read', 
    'middleware' => 'auth', 
]); 

Это где я получаю текущий идентификатор точки зрения.

//COMMENT 
Route::post('/document/{document}/comments', 
[ 
'uses' => '\App\Http\Controllers\[email protected]', 
'as' => 'comments', 
]); 

Посмотреть

<div class = "col-md-6"> 

    <div class = "form-group"> 

     <textarea id = "content">{{ $document->content }}</textarea> 

    </div> 

    <div class = "form-group"> 

     <button type = "submit" class = "btn btn-success">Approve</button> 

    </div> 
</div> 

<!--COMMENT CONTROLLER--> 
<div class = "col-md-6">           
    <form class = "form-vertical" method = "post" action = "{{ url('/document/'.$document->id.'/comments') }}"> 

     <div class = "form-group {{ $errors->has('comment') ? ' has-error' : '' }}"> 

      <label for = "comment">Comment:</label> 
      <textarea class = "form-control" rows = "4" id = "comment" name = "comment" placeholder = "Leave a feedback"></textarea> 

      @if ($errors->has('comment')) 
       <span class = "help-block">{{ $errors->first('comment') }}</span> 
      @endif 

     </div> 

     <div class = "form-group"> 

      <button type = "submit" class = "btn btn-primary">Comment</button> 

     </div> 

     <input type = "hidden" name = "_token" value = "{{ Session::token() }}"> 

    </form> 
</div> 

Я думаю, что у меня ошибка в моем CommentController, потому что, когда я попытался сохранить или вставки. Я думаю, что он не может получить текущий идентификатор модели. Любая помощь или советы? Благодаря!

Update

Модели:

комментарий

class Comment extends Model 
{ 
    protected $tables = 'comments'; 

    protected $fillable = 
    [ 
     'comment', 
     'document_id', 
    ]; 

    public function documents() 
    { 
     return $this->belongsTo('App\Models\Document'); 
    } 
} 

Документ

class Document extends Model 
{ 

    protected $table = 'documents'; 

    protected $fillable = 
    [ 
     'title', 
     'content', 
     'category_id', 
    ]; 

    public function comments() 
    { 
     return $this->hasMany('App\Models\Comment'); 
    } 
} 

ответ

1

Предполагается, что метод associate() применяется к отношениям.

Я считаю, что (учитывая, что вы Comment модель имеет documents отношение), вы должны использовать

$commentObject->documents()->associate($document); 

Кроме того, я считаю, что ваш метод должен быть следующим ..

public function postComments(Request $request, Document $document) 
{ 

    $this->validate($request, 
    [ 
     'comment' => 'required', 
    ]); 

    //No need to do the following - Laravel 5.2 will Model Bind it because of Document $document in parameters above 
    //$document = Document::find($document); 

    $commentObject = new Comment(); 

    $commentObject->comment = $request->comment; 

    $document->comments()->save($commentObject); 
    //..other tasks 


    return redirect()->back(); 
} 

$document->comments() является конструктором запросов и когда вы передаете ему ->save($comment), он обновляет document_id свойства $comment объекта и устанавливает его в $document->id, то есть id из $document объекта вызывающего этого запроса. А затем сохраняет объект $comment.

+0

Как я могу связать() '' document_id' (внешний ключ), связанный с моей моделью комментариев? См. Мой обновленный пост. У меня есть ошибка, о которой он говорит. 'SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'documents_id' в 'списке полей' (SQL: вставлять значения' comments' ('comment',' documents_id', 'updated_at',' created_at') (hahaha, , 2016-07-28 15:40:22, 2016-07-28 15:40:22)) ' – Francisunoxx

+0

@francisunoxx Пожалуйста, просмотрите .. Я обновил его –

+0

Wow! Я просто ничего себе! Оно работает!! Я немного смущен. '$ document-> comments() -> save ($ commentObject);' Можете ли вы рассказать об этом? – Francisunoxx

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