php 获取索引函数中多对多关系的文章的所有类别名称

2vuwiymt  于 2022-10-30  发布在  PHP
关注(0)|答案(1)|浏览(101)

我试图只获取类别名称,所有文章的index()函数在Laravel上。所以所有文章和每一篇文章的相关类别。这是一个多对多的关系。
目前为止我做了什么:

foreach($articles as $article) {
            if (isset($article)) {
                $article['categories'] = $article->category;
            }
        }

这让我所有的文章与相关的类别作为一个集合,它的工作,但不完全是我想要的。正如我所说,我只想要的类别名称。
我尝试了$article->category->name;显然也没有工作:$article->category->get('name');
此外,有趣的是,如果我将$article['categories']重命名为$article['cat'],我会得到2个集合,该类别包含所有相关的类别对象,另一个完全相同的类别只命名为cat。
我也试探着:

...
$article['categories'] = $this->getcat($articles);
return response()->json($articles, 200);
}

public function getcat($query) {
  if (isset($query) && is_countable($query)) {
            foreach ($query as &$entity) {
                if (!isset($entity)) { continue; }

                if (isset($entity->categories)) {
                    $originObjects = $entity->categories;
                    $competition_all = [];
                    foreach($originObjects as $object) {
                        array_push($competition_all, $object->name);
                    }
                    return $competition_all;
                }
            }
        }

这个函数返回我需要的东西,但是它没有在前端以json的形式返回。

rhfm7lfc

rhfm7lfc1#

从我所看到的..你的响应是返回response()->json($names, 200);,但是你的categories names数组被保存到$article['categories']数组中。所以..如果你返回response()->json($article, 200);,你的categories names应该返回为json。$article->category->name;不工作的原因是因为这是一个带有对象的数组,因为你的关系类型,但是这里你只调用属性。
更好的方法是在查询中添加with函数,并将关系作为第一个参数传递,然后在第二个查询中添加anonym函数,并只选择名称。
例如:

$articles = Article::with('category', function($q) { ... })->get();

相关问题