如何用逗号分隔Laravel返回的对象

时间:2019-05-23 14:04:38

标签: php laravel eloquent

首先,我很抱歉如果问题已解决。我读了很多类似的文章,但对于我的情况却不是很正确。 我正在Laravel 5.8中建立一个简单的项目。我想创建一个简单的书店,我需要一本书有多位作者,因此每个书名后面是作者,或者作者(如果有的话)后面是逗号,最后一个是单词“与”。

我已经建立了两个模型,“作者”和“书本”,以及它们各自的表,以及数据透视表,因为它们之间的关系属于belongsToMany。一切都像魅力一样,我得到了预期的结果。但是,我无法根据需要设置结果的格式。对于多位作者,最后我总是得到一个逗号。由于我无法正确使用逗号,因此在最后一位作者的情况下,我还没有尝试添加最后一个“和”。 对于单个作者,解决方案很简单,我只使用条件式。 但是,在有多位作者的情况下,事情变得复杂了。 解决类似问题的最流行方法是以各种类似方式使用implode()。这种方法的问题在于,由于Eloquent正在使用其内部逻辑来执行查询,因此当我遍历“书”时,没有作者列,仅是对数据透视表的引用。此外,作者的名字和姓氏在不同的列中。因此,当我尝试通过获取相应数据手动创建“ implodable()”数组时,由于每个名称都由名字和有神论者的名字组成,因此项目大小将增加一倍。最重要的是,整个过程在一个双循环中运行,这对我来说使事情变得更加复杂。 我敢肯定有一个简单的方法可以解决这个问题。

这是到目前为止我的刀片服务器代码的示例。当然,解决问题时应相应地重新排列条件,以实现“和”情况:

<ul>
      @foreach ($books as $book)
        <li>{{ $book->title }} by

            @if (count($book->author) == 1)  
              @foreach ($book->author as $name)
                {{ $name->last_name }}
                {{ $name->first_name }}
              @endforeach

            @else 

              @foreach ($book->author as $name)
                {{ $name->last_name }}
                {{ $name->first_name }}

{{-如果还有其他名称,请在此处打印逗号,如果最后一个名称则用'and'。问题似乎需要有条件地解决,但是如何解决呢? -}}

              @endforeach
            @endif

          </li>
      @endforeach
</ul>

我的数据库结构:

  • '作者':'id','last_name','first_name','created_at','updated_at'
  • 'books':'id','title','created_at','updated_at'
  • 'author_book':'id','author_id','book_id','created_at','updated_at'

预期结果:

  1. 标题1,作者1
  2. 标题2,作者1和2
  3. 标题3(作者1、2和3)

实际结果:

  1. 标题1,作者1
  2. 标题2,作者1和2,以及
  3. 标题3,作者1、2、3和

3 个答案:

答案 0 :(得分:0)

  1. 如果在内部使用foreach,请删除for x in range(len(SageResult)): SOPOrderReturnID=SageResult[x]
  2. 在用@if (count($book->author) == 1)关闭条件之前,您不能使用@else
  3. @endif的结构错误,请改用@else
  4. 如果您想让支票作者计数并显示额外的价值,请在@elseif的foreach内进行。
  5. 您与书本->作者有什么关系?一本书可以有很多作者吗?

答案 1 :(得分:0)

只需显示li { display: inline-block; } ul { list-style: none; } ,根据您的实际结果,您就不需要再进行复杂的检查。

implode(', ', $book->author)

答案 2 :(得分:0)

如果不需要“和”机制,则用逗号implode可以解决问题。对于“和”机制,请使用以下代码:

<ul>
    @foreach ($books as $book)
      <li>{{ $book->title }} by
          @for ($i = 0; $i < count($book->author); $i++)
            {{ $book->author[$i]->last_name }}
            {{ $book->author[$i]->first_name }}
            @if ($i == count($book->author) - 2)
              &nbsp;and&nbsp;
            @endif
            @if ($i < count($book->author) - 2)
              ,&nbsp; 
            @endif
          @endfor
      </li>
    @endforeach
</ul>

在不使它们彼此链接的必要之处添加了非空格&nbsp