我想做的是将每篇文章的注释附加到articles对象,但是问题是我每次需要请求不同数量的注释。
出于某种原因,我需要为此使用mutators,因为有时我会请求50篇文章,而又不想遍历结果并添加注释。
因此,可以执行以下操作以及如何传递额外的参数。
这个模型:
class Article extends Model
{
protected $appends = ['user', 'comments', 'media'];
public function getCommentsAttribute($data, $maxNumberOfComments = 0)
{
// I need to set maxNumberOfComments
return $this->comments()->paginate($maxNumberOfComments);
}
}
这是控制器:
class PostsController extends Controller
{
public function index()
{
//This will automatically append the comments to each article but I
//have no control over the number of comments
$posts = Post::user()->paginate(10);
return $posts;
}
}
我不想做的是:
class PostsController extends Controller
{
public function index()
{
$articles = Post::user()->all();
$number = 5;
User::find(1)->articles()->map(function(Article $article) {
$article['comments'] = $article->getCommnets($number);
return $article;
});
return Response::json($articles);
}
}
有更好的方法吗?因为我经常使用它,所以接缝不正确。
从Laravel源代码判断,不-不可能将额外的参数传递给该魔术访问器方法。
最简单的解决方案是在您的类中添加另一个额外的方法,该方法可以接受您希望的任何参数-您可以使用该方法代替magic属性。
例如。只需将您的名称重命名getCommentsAttribute()
为getComments()
并解雇,->getComments()
而不是->comments
在您的视图中,您就可以开始使用。
这实际上是按照我的想法进行操作的一种好方法,但是这里的问题是,例如,当我请求50篇以上的文章时,我需要做一个循环并
getComments()
在每篇文章上使用并返回要避免的结果。有什么区别?如果您使用-> comments,它将完全相同,只是名称不同。在建议的方法中,您引用的是comments()-这是一个查询生成器,这意味着您每次访问此属性时都将运行一个新查询。真的没有区别:)
丹尼斯·迈森科(Denis Mysenko)我更新了我的问题,使其更加清楚。