Как запятую отделить свойства от возвращаемого объекта Laravel - PullRequest
0 голосов
/ 23 мая 2019

Во-первых, мои извинения, если проблема была решена.Я прочитал много подобных постов, но не совсем подходящий для моего случая.Я настраиваю простой проект в Laravel 5.8.Я хочу создать простой книжный магазин, и мне нужна книга с несколькими авторами, чтобы за каждым названием следовал автор или авторы (если их много), разделенные запятыми, а последний - словом «и».

Я установил две модели: «Автор» и «Книга» и их соответствующие таблицы, а также сводную таблицу, поскольку они находятся в отношении, принадлежащем ToMany.Все работает как шарм, я получаю свои результаты, как и ожидалось.Однако я не могу отформатировать результаты так, как мне нужно.В случае нескольких авторов, я всегда получаю дополнительную запятую в конце.Поскольку я не могу получить правильные запятые, я еще не пытался добавить последние 'и' в случае последнего автора.В случае одного автора решение простое, я просто использую условное.Однако, в случае нескольких авторов, все усложняется.Самым популярным способом решения подобных проблем было использование 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 }}

{{- напечатать здесь запятую, если есть другие имена, или«и», если это последний.Проблема кажется, что ее нужно решать не условно, а как?-}}

              @endforeach
            @endif

          </li>
      @endforeach
</ul>

Структура моей БД:

  • «авторы»: «id», «last_name», «first_name», «creation_at», «updated_at»
  • 'books': 'id', 'title', 'creation_at', 'updated_at'
  • 'author_book': 'id', 'author_id', 'book_id', 'creation_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 голосов
/ 23 мая 2019

Просто отобразите implode(', ', $book->author), основываясь на вашем фактическом результате, вам не нужно делать сложную проверку, если / еще больше.

@foreach ($books as $book)
        <li>{{ $book->title }} by {{print implode(', ', $book->author)}}</li>
    @endforeach
0 голосов
/ 23 мая 2019

Если вам не нужен механизм "и", тогда 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 везде, где необходимо, чтобы не связать их друг с другом

0 голосов
/ 23 мая 2019
  1. Удалить @if (count($book->author) == 1), если вы используете foreach внутри.
  2. Вы не можете использовать @else, когда перед тем, как закрыть условие с помощью @endif.
  3. Это @else имеет неправильную конструкцию, вместо этого используйте @elseif.
  4. Если вы хотите проверить количество авторов и показать дополнительную ценность, сделайте это внутри foreach с помощью $book->author()->count().
  5. Какое отношение вы имеете к книге -> автору? У одной книги может быть много авторов или нет?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...