Home > Mobile >  Laravel::with doesn't pull the relationship when columns are specified
Laravel::with doesn't pull the relationship when columns are specified

Time:05-19

I want to get a comment with just it's id belonging to a post.

Route::get('/', function () {
  $post = Post::with([
    'comment' => fn ($query) => $query->select('id')
  ])->find(1);
  return $post;
});

However, the comment is null in response.

{
    "id": 1,
    "title": "Alias iste quo tempore quis totam maxime. Illo fuga qui modi ut quae. Nobis eum soluta quas.",
    "body": "Officiis id earum suscipit magnam reiciendis alias fugiat. Deserunt rerum in tempora odit nobis. Sunt similique accusamus suscipit aliquam quia. Sunt harum rem incidunt rerum id nesciunt. Reiciendis rerum placeat sed dolores temporibus ducimus autem. Quidem ullam ut ut voluptatum ea. Et magni aut ut animi ea cupiditate eum. Ut similique consequuntur et enim officiis nobis. Occaecati nostrum sint labore sint quia. Reprehenderit veritatis qui provident eum reprehenderit commodi.",
    "created_at": "2022-05-12T10:39:12.000000Z",
    "updated_at": "2022-05-12T10:39:12.000000Z",
    "comment": null
}

When I remove the select method, I do get the comment,

Route::get('/', function () {
  $post = Post::with('comment')->find(1);
  return $post;
});
{
    "id": 1,
    "title": "Alias iste quo tempore quis totam maxime. Illo fuga qui modi ut quae. Nobis eum soluta quas.",
    "body": "Officiis id earum suscipit magnam reiciendis alias fugiat. Deserunt rerum in tempora odit nobis. Sunt similique accusamus suscipit aliquam quia. Sunt harum rem incidunt rerum id nesciunt. Reiciendis rerum placeat sed dolores temporibus ducimus autem. Quidem ullam ut ut voluptatum ea. Et magni aut ut animi ea cupiditate eum. Ut similique consequuntur et enim officiis nobis. Occaecati nostrum sint labore sint quia. Reprehenderit veritatis qui provident eum reprehenderit commodi.",
    "created_at": "2022-05-12T10:39:12.000000Z",
    "updated_at": "2022-05-12T10:39:12.000000Z",
    "comment": {
        "id": 1,
        "post_id": 1,
        "comment": "Exercitationem voluptatibus eos velit consequatur aut voluptatem voluptas. Sed et magnam omnis nesciunt dignissimos rerum enim. Accusamus ipsa non aspernatur iure architecto.",
        "created_at": "2022-05-12T10:39:13.000000Z",
        "updated_at": "2022-05-12T10:39:13.000000Z"
    }
}

Post.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
  use HasFactory;

  public function comment()
  {
    return $this->hasOne(Comment::class);
  }
}

What am I doing wrong?

CodePudding user response:

You need to define the foreign key in eager loading.

https://laravel.com/docs/9.x/eloquent-relationships#eager-loading-specific-columns

 Route::get('/', function () {
  $post = Post::with([
    'comment' => fn ($query) => $query->select('id','post_id')
  ])->find(1);
  return $post;
});
  • Related