RandiSoft
RandiSoft

Reputation: 1

Laravel: LogicException in Model.php line 2673: Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

I have one DB which has 3 tables: user, statuses and friends. My status table has a relationship column "parent id" which is NULL but stores the user_id of a user that replies to a status. Below is my Status.php code:

namespace Pictogram\Models;

use Illuminate\Database\Eloquent\Model;

class Status extends Model
{
    protected $table = 'statuses';

    protected $fillable = [
        'body'
    ];

    public function user()
    {
        return $this->belongsTo('Pictogram\Models\User', 'user_id');
    }

    public function scopeNotReply($query)
    {
        return $query->whereNull('parent_id');
    }

    public function replies()
    {
        return $this->hasMany('Pictogram\Models\Status', 'parent_id');
    }
}

And blow is from my route file: This controls replies to status

Route::post('/status', [
    'uses' => '\Pictogram\Http\Controllers\StatusController@postStatus',
    'as' => 'status.post',
    'middleware' => ['auth'],
]);

Route::post('/status/{statusId}/reply', [
    'uses' => '\Pictogram\Http\Controllers\StatusController@postReply',
    'as' => 'status.reply',
    'middleware' => ['auth'],
]);

And my status controller .php

class StatusController extends Controller 
{
    public function postStatus(Request $request)
    {
        $this->validate($request, [
            'status' => 'required',
        ]);

        Auth::user()->statuses()->create([
            'body' => $request->input('status'),
        ]);

        return redirect()
            ->route('home')
            ->with('info', 'Status updated.');
    }

    public function postReply(Request $request, $statusId)
    {
        $this->validate($request, [
            "reply-{$statusId}" => 'required',
        ], [
            'required' => 'The reply body is required.'
        ]);

        $status = Status::notReply()->find($statusId);

        if (!$status) {
            return redirect()->route('home');
        }

        if (!Auth::user()->isFriendsWith($status->user) && Auth::user()->id !== $status->user->id)
        {
            return redirect()->route('home');
        }

        $reply = Status::create([
            'body' => $request->input("reply-{$statusId}"),
        ])->user()->associate(Auth::user());

        $status->replies()->save($reply);

        return redirect()->back();

    }

}

And lastly this is the line 2673 of models .php below:

protected function getRelationshipFromMethod($method)
{
    $relations = $this->$method();

    if (! $relations instanceof Relation) {
        throw new LogicException('Relationship method must return an object of type '
        .'Illuminate\Database\Eloquent\Relations\Relation');
    }

    return $this->relations[$method] = $relations->getResults();
}

I am using Laravel 5.2. Now my issue is that the reply gets save to the table because the empty parent_id then takes the user_id of the user who replied but then it brings up an error page that has these errors below. Error1/2

Error2/2

Upvotes: 0

Views: 267

Answers (1)

Prashant Prajapati
Prashant Prajapati

Reputation: 1015

Make sure your relationship name is proper in Status model. check your replies() realtion in Status model. it return the Status Relationship i should be the realtion of replies i.e Reply

public function replies()
{
    return $this->hasMany('Pictogram\Models\Reply', 'parent_id');
}

Upvotes: 1

Related Questions