在 laravel 中,如何将额外数据传递给突变体和访问器

2022-08-31 00:42:41

我试图做的是将每篇文章的注释附加到articles对象上,但问题是我每次都需要请求不同数量的评论。

出于某种原因,我需要使用突变体,因为有时我请求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);
    }    

}

有没有更好的方法来做到这一点?因为我经常使用它,它没有接缝正确。


答案 1

从Laravel源代码来看,不 - 不可能向这个神奇的访问器方法传递额外的参数。

最简单的解决方案是在类中添加另一个额外的方法,该方法可以接受您想要的任何参数 - 您可以使用该方法而不是magic属性。

例如。只需重命名您的 to 和 fire 而不是在您的视图中,您就可以开始了。getCommentsAttribute()getComments()->getComments()->comments


答案 2

我只是在模型上设置了一个公共属性。在访问点,我将该属性更新为所需的值。然后,在特性方法中,我从该属性中读取所需的参数。所以,把所有这些放在一起,

// Model.php

public $arg1= true;

public function getAmazingAttribute () {

   if ($this->arg1 === false)
      $this->relation()->where('col', 5);

   else $this->relation()->where('col', 15);
}

// ModelController.php
$instance->arg1 = false;

$instance->append('amazing');

推荐