Home > front end >  Laravel, get relation row instead of id
Laravel, get relation row instead of id

Time:03-05

I want to get author row instead of author_id. I could this with add collection and change one by one but has Laravel any function for this? Well, I want make this one line Can i use something like this

Book::where('id',$bid)->with('author')->first('author_id AS author'); //Changes only coulmn name :(

model

public function author()
    {
        return $this->hasOne(Author::class,'id','author_id');
    }

query

Book::where('id',$bid)->with('author')->first()

Output

  {
    "id": 1,
    "name": "Book 1",
    "author_id": 3,
    "category_id": 2,
    "level_id": 1,
    "book_language_id": 1,
    "book_length": 0,
    "img": "book1.png",
    "summary": "Summary 1",
    "rate_avg": "2.75",
    "created_at": "2022-03-04T18:46:32.000000Z",
    "updated_at": "2022-03-04T18:52:28.000000Z",
    "author": {
        "id": 3,
        "name": "Author 3",
        "created_at": "2022-03-04T18:46:32.000000Z",
        "updated_at": "2022-03-04T18:46:32.000000Z"
    }
}

Want

{
    "id": 1,
    "name": "Book 1",
    "author": {
        "id": 3,
        "name": "Author 3",
        "created_at": "2022-03-04T18:46:32.000000Z",
        "updated_at": "2022-03-04T18:46:32.000000Z"
    },
    "category_id": 2,
    "level_id": 1,
    "book_language_id": 1,
    "book_length": 0,
    "img": "book1.png",
    "summary": "Summary 1",
    "rate_avg": "2.75",
    "created_at": "2022-03-04T18:46:32.000000Z",
    "updated_at": "2022-03-04T18:52:28.000000Z",
    
}

CodePudding user response:

in your query

Book::where('id',$bid)->with('author')->first()

you are getting the book that has that id and you are eager loading the author relation, so in order to get the author you have to access the author field:

Book::where('id',$bid)->with('author')->first()->author

CodePudding user response:

As I said I can this with collection like this:

$b=Book::where('id',$bid)->with('author')->first();

                    $book=collect([
                        'id'=>$b->id,
                        'name'=>$b->name,
                        'author'=>$b->author,
                        'category_id'=>$b->category_id,
                        'level_id'=>$b->level_id,
                        'book_language_id'=>$b->book_language_id,
                        'book_length'=>$b->book_length,
                        'summary'=>$b->summary,
                        'rate_avg'=>$b->rate_avg,
                    ]);

But this method seems unnecessary

  • Related