如何覆盖Laravel中的eager加载属性?

时间:2017-08-08 23:30:22

标签: php laravel laravel-5

如果我有这样的话:

$book = App\Book::with('authorInfo')->first();

如何将$ book-> authorInfo设置为新值? 我试过这样设置:

$book->authorInfo = 'test';

但它没有改变价值。

当我从我的控制器方法返回$ book时,属性authorInfo被转换为snake case。

{
    book: {
        author_info: null
    }
}

2 个答案:

答案 0 :(得分:4)

简短版本:您可以使用Eloquent模型提供的setRelation方法。

假设您的App\Book模型如下所示:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    public function author()
    {
        return $this->belongsTo(Author::class);
    }
}

您的App\Author模型如下所示:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    public function books()
    {
        return $this->hasMany(Book::class);
    }
}

当您获取图书并急切加载作者关系时,您可以使用Author方法将此关系替换为setRelation模型的新实例:

// Fetch book and load the author.
$book = App\Book::with('author')->first();

// Create a new instance of author.
$newAuthor = new App\Author;
$newAuthor->name = 'John Doe';
$newAuthor->save();

// Replace the loaded relation.
$book->setRelation('author', $newAuthor);

希望这有帮助!

答案 1 :(得分:0)

您必须指向作者,然后更改此

的名称
$book->author->author = 'test';

希望这可以帮到你

或者您可以尝试直接修改属性“author_info”:$book->author_info = 'test';