0

我有模型“帖子”,其中包含“id”、“名称”、“内容”和“状态”列

我有模型“PostStatus”,其中包含“id”和“name”列

在 Post.php 我有以下内容:

class Post extends Model
{
    public function status()
    {
        return $this->belongsTo('App\PostStatus','status');
    }
}

在其他地方的控制器中,我有:

Post::with('status')->get()->toArray();

它返回一个数组,其中所有帖子的“id”、“名称”作为“内容”作为它们的列值,“状态”作为帖子状态表中相关行的数据数组。我想要实现的是“状态”列只是 PostStatus 模型中“名称”列的字符串值,而不是整行的数组。我尝试在 Post 模型中的 status 函数上使用 ->select ,但这仍然将值作为数组返回。我宁愿避免直接使用 SQL 来实现我的目标。

总之,我希望控制器中的函数返回:

array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(12) "Post Example"
    ["content"]=>
    string(7) "Content"
    ["status"]=>
    string(6) "Active"
  }

而不是

array(4) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(12) "Post Example"
    ["content"]=>
    string(7) "Content"
    ["status"]=>
    array(2) {
      ["id"]=>
      int(1)
      ["name"]=>
      string(6) "Active"
    }
  }
4

1 回答 1

2

这并不是关系的真正设计方式,你可能会发现你以后实际上需要这种关系来做其他事情,所以覆盖它可能不是最好的行动方案。

您应该考虑使用访问器来返回属性(例如,$post->status_name)。
https://laravel.com/docs/5.8/eloquent-mutators#accessors-and-mutators

class Post extends Model
{
    // append the attribute for serialization
    $appends = ['status_name'];

    // get an attribute named 'status_name'
    public function getStatusNameAttribute()
    {
        return $this->status->name ?? '';
    }

    public function status()
    {
        return $this->belongsTo('App\PostStatus','status');
    }
}

注意:如果你打算这样做,with('status')在获取帖子时仍然使用它是明智的,因为它会阻止 Laravel 为每个标签运行单独的查询。您甚至可能希望在 Post 模型的引导方法中将此作为全局范围应用,因此您不必每次都这样做。
https://laravel.com/docs/5.8/eloquent#global-scopes

于 2019-09-21T19:06:18.653 回答