Laravel 5.1 通过贪婪加载返回合并字段

4

我目前遇到了一个问题,就是无法检索包含一个单元格内所有商店评论的连接单元格。

我的数据库设置方式是:一个商店可以有多个评论,每条评论必须与用户相关联。

虽然通过急切加载正常返回这些内容没有问题,但是我想实现的是一个只包含一个商店的所有评论列表的单个单元格,例如:

store1{Comments:["10-10-2015 - Comment 1 - User 1\n10-10-2015 - Comment 2 - User2"]},
store2{Comments:["10-10-2015 - Comment 3 - User3\n10-10-2015 - Comment 4 - User4\n10-10-2015 - Comment 5 - User5"]}

我尝试过两种不同的方法来使其工作:在检索商店时选择连接的列:
return $stores = Store::with('StoreComment','StoreComment.CreatedBy')
->select(DB::raw("group_concat(DATE_FORMAT(storecomment.created_at,'%Y-%m-%d'), ' - ', Comment, ' - ', ShortName, '\n'  ORDER BY storecomment.created_at DESC SEPARATOR '') as storecomments"))
->groupBy('store.StoreID')
->get();

由此导致一些“字段未找到”错误,我无法解决。

我还尝试在我的存储模型中采用了这种方法:

public function FormattedComments()
{
  return $this->hasOne('App\Models\StoreComment','StoreID','StoreID')
              ->join('users','StoreComment.created_by','=','users.UserID')
              ->select(DB::raw("group_concat(DATE_FORMAT(StoreComment.created_at,'%Y-%m-%d'), ' - ', Comment, ' - ', ShortName, '\n'  ORDER BY StoreComment.created_at DESC SEPARATOR '')"))
              ->groupBy('StoreID')
              ->whereNull('StoreComment.deleted_at')
              ->orderBy('StoreComment.created_at','DESC');
}       

然而,这只会检索到一个空单元格。 有人知道我在哪种方法中做错了吗?谢谢!

为什么要这样做呢?比如说,为什么不在视图中随意格式化结果呢? - Amir Bar
@amirbar 这段代码是为了一个报表工具,需要在下载中对每个店铺列出所有的店铺评论。虽然我可以在控制器中格式化它,但我认为那样做效率相当低下。 - pyy
是的,我会在某个格式化程序类中进行格式化,而不是在数据库中进行。 - Amir Bar
1个回答

0

在 StoreComment 模型中定义评论的用户关系:

class StoreComment extends Model
{
  public function user()
  {
    return $this->belongsTo('App\User','column name in which you have stored user id in store_comment table');
  }
}

class Store extends Model
{
  public function StoreComment()
  {
    return $this->hasMany('App\StoreComment','StoreID','StoreID')->with('user');
  }
}

现在可以这样获取:

$stores = Store::with('StoreComment');

如果您想为StoreComment定义一个自定义属性,请在StoreComment模型中像这样定义:

class StoreComment extends Model
{
  protected $appends = ['formattedComment'];

  public function user()
  {
    return $this->belongsTo('App\User','column name in which you have stored user id in store_comment table');
  }

  public function getFormattedCommentAttribute()
  {
    return $this->Comment.' - '.$this->ShortName;
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接