Search code examples
phprelationshiplaraveleloquentlaravel-3

"Unhandled Exception: Creating default object from empty value"


I'm trying to show a snippet of code and in the same time display comments that you can make to the snippets (I call the snippets code). But I'm having troubles to view the username of the user who made each and every comment. I expect to have each user when I'm calling with(array('user', 'comments', 'comments.user')) but I just get an unhandled exception.

//Models
class Code extends Eloquent 
{
    public function user() {
        return $this->belongs_to('User');
    }

    public function comments() {
        return $this->has_many('Comment');
    }
}

class Comment extends Eloquent
{
    public function user() {
        $this->belongs_to('User');
    }

    public function code() {
        $this->belongs_to('Code');
    }
}

class User extends Eloquent 
{
    public function codes() {
        return $this->has_many('Code');
    }

    public function comments() {
        return $this->has_many('Comment');
    }
}
//Controller
    public function get_show($id)
    {
        //$code = Code::with(array('user', 'comments'))->where_slug($id)->first();
        //$comments = Comment::with(array('user'))->where_code_id($id)->get();
        $code = Code::with(array('user', 'comments', 'comments.user'))->where_slug($id)->first();
        dd($code);
        //return View::make('code.show')->with(array('code' => $code));
    }   

//View
    <h2>{{ $code->title }}</h2>
    @include('code.controls')
    <p>Syntax: {{ $code->syntax}} </p>
    <p><pre class="prettyprint linenums"><code class="language-{{ $code->syntax }}">{{ $code->content }}</code></pre></p>
    @foreach($code->comments as $comment)
        <div class="comment">
        <p><a href="">#{{ $comment->id }}</a></p>
        {{ User::find($comment->user_id)->first()->name }}
        <p>{{ $comment->body }}</p>
        </div>
    @endforeach

//Message when trying to view
Unhandled Exception
Message:

Creating default object from empty value

Location:

/home/victor/Projects/check-my-code/laravel/database/eloquent/query.php on line 167

Stack Trace:

#0 /home/victor/Projects/check-my-code/laravel/laravel.php(40): Laravel\Error::native(2, 'Creating defaul...', '/home/victor/Pr...', 167)
#1 /home/victor/Projects/check-my-code/laravel/database/eloquent/query.php(167): Laravel\{closure}(2, 'Creating defaul...', '/home/victor/Pr...', 167, Array)
#2 /home/victor/Projects/check-my-code/laravel/database/eloquent/query.php(140): Laravel\Database\Eloquent\Query->load(Array, 'user', NULL)
#3 /home/victor/Projects/check-my-code/laravel/database/eloquent/query.php(74): Laravel\Database\Eloquent\Query->hydrate(Object(Comment), Array)
#4 /home/victor/Projects/check-my-code/laravel/database/eloquent/query.php(186): Laravel\Database\Eloquent\Query->get()
#5 /home/victor/Projects/check-my-code/laravel/database/eloquent/query.php(140): Laravel\Database\Eloquent\Query->load(Array, 'comments', NULL)
#6 /home/victor/Projects/check-my-code/laravel/database/eloquent/query.php(74): Laravel\Database\Eloquent\Query->hydrate(Object(Code), Array)
#7 /home/victor/Projects/check-my-code/application/controllers/codes.php(31): Laravel\Database\Eloquent\Query->get()
#8 [internal function]: Codes_Controller->get_show('testar-snippets')
#9 /home/victor/Projects/check-my-code/laravel/routing/controller.php(325): call_user_func_array(Array, Array)
#10 /home/victor/Projects/check-my-code/laravel/routing/controller.php(285): Laravel\Routing\Controller->response('show', Array)
#11 /home/victor/Projects/check-my-code/laravel/routing/controller.php(165): Laravel\Routing\Controller->execute('show', Array)
#12 /home/victor/Projects/check-my-code/laravel/routing/route.php(153): Laravel\Routing\Controller::call('codes@show', Array)
#13 /home/victor/Projects/check-my-code/laravel/routing/route.php(124): Laravel\Routing\Route->response()
#14 /home/victor/Projects/check-my-code/laravel/laravel.php(125): Laravel\Routing\Route->call()
#15 /home/victor/Projects/check-my-code/public/index.php(34): require('/home/victor/Pr...')
#16 {main}

Solution

  • The methods in the class Comment is missing return statements.

    class Comment extends Eloquent
    {
        public function user() {
            $this->belongs_to('User');
        }
    
        public function code() {
            $this->belongs_to('Code');
        }
    }
    

    Should be

    class Comment extends Eloquent
    {
        public function user() {
            return $this->belongs_to('User');
        }
    
        public function code() {
            return $this->belongs_to('Code');
        }
    }
    

    Got help from a thread on the Laravel forums: http://forums.laravel.io/viewtopic.php?id=6266