Laravel спасает отношения от многих ко многим

Модель

public function categories()
{
    return $this->belongsToMany('App\Category', 'post_categories');
}

public function posts()
{
    return $this->belongsToMany('App\Post', 'post_categories');
}

Контроллер

public $DEFAULT_LANGUAGE = 1;
public function store(Request $request)
{
    $titles = $request->PostTitle;
    $post = new Post();
    $post->PostTitle = $titles[$this->DEFAULT_LANGUAGE];
    $post->save();
    $post->categories()->attach($request->categoryID[$this->DEFAULT_LANGUAGE]);
    unset($titles[$this->DEFAULT_LANGUAGE]);
    foreach ($titles as $key => $title) {
        $post = new Post();
        $post->PostTitle = $request->PostTitle[$key];
        $post->save();
        $post->categories()->attach($request->categoryID[$key]);
    }

    return response()->json($post);

Вид

<select class="form-control category-list" name="categoryID[]" multiple="multiple" data-placeholder="Pilih Kategori">
    @foreach($categories as $category)
        <option value="{{ $category->id }}">
            {{ $category->CategoryName }}
        </option>
    @endforeach
</select>

Если у меня две категории, и я хочу выбрать все категории, почему я получаю только последнюю категорию? Я также пробовал использовать foreach, но получил смещение ошибки. Любая идея?

У меня есть две панели вкладок .. Я сохраняю два идентификатора категории на вкладке 1 и один идентификатор категории на вкладке 2 .. затем я нажимаю кнопку отправки .. ответ заголовка два идентификатора категории на вкладке 1, но в моей базе данных я получил только последнюю запись

  • PostTitle [1]: sadasd
  • categoryID [1]: 1
  • categoryID [1]: 2
  • PostTitle [2]: asdasd
  • categoryID [2]: 1

Когда я консоль, он показывает два CategoryID ..

https://i.stack.imgur.com/jBl2B.png


person Saengdaet    schedule 20.09.2017    source источник
comment
Это опечатка? BelongsToMany должно быть belongsToMany   -  person linktoahref    schedule 20.09.2017
comment
вы можете использовать sync () вместо attach ();   -  person Demonyowh    schedule 20.09.2017
comment
как ты попал $categories в представление ??   -  person Maraboc    schedule 20.09.2017
comment
@linktoahref это то же самое .. Я перешел на ownToMany, и мне остается только последняя запись ..   -  person Saengdaet    schedule 20.09.2017
comment
@Maraboc Я положил $ Categories = Category :: all (); в создании контроллера   -  person Saengdaet    schedule 20.09.2017
comment
Вы можете сделать $categories = Category::all(); dd($categories); и сообщить нам, что вы получите?   -  person Maraboc    schedule 20.09.2017
comment
@Demonyowh ничего не изменилось .. все равно получится последняя запись   -  person Saengdaet    schedule 20.09.2017
comment
Не могли бы вы показать метод контроллера, который возвращает представление?   -  person Rwd    schedule 20.09.2017
comment
@RossWilson Я использую store в своем контроллере, вы можете это увидеть прямо сейчас. Я его поменял ..   -  person Saengdaet    schedule 20.09.2017
comment
Вы проверили значение, хранящееся в запросе?   -  person Demonyowh    schedule 20.09.2017
comment
@Demonyowh Я использую dd (count ($ request- ›categoryID)); .. но он возвращает 1 .. Я не знаю почему .. но на мой взгляд, я выбираю 2 categoryID   -  person Saengdaet    schedule 20.09.2017
comment
это представление ajax или нормальной формы?   -  person Demonyowh    schedule 20.09.2017
comment
@Demonyowh ajax .. Я запутался, почему count = 1? Я думаю, что если я выберу 2 идентификатора категории, мое количество = 2, почему я получил 1   -  person Saengdaet    schedule 20.09.2017
comment
перед тем, как ajax попытается занести в console.log значение переменной категории ..   -  person Demonyowh    schedule 20.09.2017
comment
@Demonyowh, когда я нажимаю "Отправить", я получаю такие заголовки .. (посмотрите на мой вопрос)   -  person Saengdaet    schedule 20.09.2017
comment
@jamesriady Пожалуйста, попробуйте использовать dd($request->input('categoryID')), посмотрим, что вы получите   -  person Jonjie    schedule 20.09.2017


Ответы (5)


Присоединение / отключение

Из документов

Eloquent также предоставляет несколько дополнительных вспомогательных методов, которые делают работу со связанными моделями более удобной. Например, представим, что у пользователя может быть много ролей, а у роли может быть много пользователей. Чтобы прикрепить роль к пользователю, вставив запись в промежуточную таблицу, которая объединяет модели, используйте метод attach:

Вы передаете только одно значение во вложении и, таким образом, получаете только последнюю запись, чтобы получить все, что вам нужно, чтобы передать все categoryID

public $DEFAULT_LANGUAGE = 1;
public function store(Request $request)
{
    $titles = $request->PostTitle;
    $post = new Post();
    $post->PostTitle = $titles[$this->DEFAULT_LANGUAGE];
    $post->save();
    $post->categories()->attach($request->categoryID[$this->DEFAULT_LANGUAGE]);
    unset($titles[$this->DEFAULT_LANGUAGE]);
    $data= array();
    foreach ($titles as $key => $title) {
        $post = new Post();
        $post->PostTitle = $request->PostTitle[$key];
        $post->save();
        $data[]= $post->categories()->attach($request->categoryID[$key]);
    }

    return response()->json($data);

`

person Mr. Pyramid    schedule 20.09.2017
comment
Я пошел по твоему пути, но все тот же .. Он получил только последнюю запись .. У тебя есть идеи? - person Saengdaet; 20.09.2017
comment
как я пишу, CategoryID [1] = 1, CategoryID [1] = 2 .. В базе данных я получаю только 2 .. Я думаю, что первое значение перезаписывается последним значением. - person Saengdaet; 20.09.2017
comment
используйте print_r($title) или dd(), чтобы проверить, что у вас есть в вашем массиве, это избавит вас от сомнений в том, что первое значение перезаписывается последним значением или нет - person Mr. Pyramid; 21.09.2017
comment
дд ($ название); Я получил значение $ title - person Saengdaet; 21.09.2017
comment
хорошо, а вы проверили print_r($title), получаете ли вы оба значения или только последнее значение ?? - person Mr. Pyramid; 21.09.2017
comment
Я пытаюсь использовать такой способ .. public $ DEFAULT_LANGUAGE = 1; $ category = $ request- ›categoryID ($ this-› DEFAULT_LANGUAGE); print_r (категория $); когда я выбираю два categoryID, возвращается 2. Если я выбираю один categoryID, возвращается 1. - person Saengdaet; 21.09.2017
comment
хорошо, братан, вы получаете значение, потому что вы вставили запись и, таким образом, она возвращает последнюю вставленную запись, я не ошибаюсь - person Mr. Pyramid; 21.09.2017
comment
Я не понимаю, почему array ($ request- ›categoryID [$ this-› DEFAULT_LANGUAGE]); вернуть только последнюю запись? можешь мне объяснить? - person Saengdaet; 21.09.2017
comment
вы передаете только один идентификатор, который вам нужен, чтобы передать идентификаторы, если я где-то ошибся, просветите меня :) - person Mr. Pyramid; 21.09.2017
comment
Примите ответ, чтобы закрыть вопрос stackoverflow.com/help/someone-answers - person Mr. Pyramid; 22.09.2017

Я нашел решение .. Мне нужно только изменить вид

<select class="form-control category-list" name="categoryID[{{$language->id}}][]" multiple data-placeholder="Pilih Kategori">
  @foreach($categories as $category)
    <option value="{{$category->id}}">{{$category->CategoryName}}</option>
  @endforeach
</select>

а также поменять контроллер

$post->categories()->attach($request->categoryID[$this->DEFAULT_LANGUAGE]);
person Saengdaet    schedule 22.09.2017
comment
отлично, наконец-то ты получил то, что хочешь - person Mr. Pyramid; 22.09.2017

Для чего вы используете эту модель, как она называется? Обычно это делается так: Приложение \ Категория:

public function posts()
{
    return $this->belongsToMany('App\Post', 'post_categories');
}

Приложение \ Сообщение:

public function categories()
{
    return $this->belongsToMany('App\Category', 'post_categories');
}

Эти две взаимосвязи находятся не в одном файле, а в двух отдельных моделях, которые связаны.

person Angel Miladinov    schedule 20.09.2017
comment
Я отделяю файл в своем проекте - person Saengdaet; 20.09.2017
comment
Хорошо, попробуйте сначала найти категорию, а затем прикрепить ее так: $category = Category::find($request->categoryID);, а затем $post->categories()->attach($category); - person Angel Miladinov; 20.09.2017
comment
У меня только последняя запись - person Saengdaet; 20.09.2017

на ваш взгляд, попробуйте заменить multiple = "multiple" на несколько

person Matius Nugroho Aryanto    schedule 20.09.2017
comment
Проблема не в поле выбора. Он не может получить все категории на основе того, что он сделал. - person Morteza Rajabi; 20.09.2017
comment
@MortezaRajabi yap - person Saengdaet; 20.09.2017
comment
он не может получить все категории, потому что в запрос передана только последняя выбранная категория, обычно это потому, что представление отправило их неправильно - person Matius Nugroho Aryanto; 20.09.2017

Попробуй этого, братан. Я просто меняю ваш код в контроллере. Я бы хотел, чтобы он вам помог :)

Модель

public function categories()
{
    return $this->BelongsToMany('App\Category', 'post_categories');
}

public function posts()
{
    return $this->BelongsToMany('App\Post', 'post_categories');
}

Контроллер

$post = App\Post::findOrFail($id);
$post = $post->load('categories');
$attributes = $post->attributes->toArray();

Вид

<select class="form-control category-list" name="categoryID[]" multiple="multiple" data-placeholder="Pilih Kategori">
    @foreach($categories as $category)
        <option value="{{ $category->id }}">
            {{ $category->CategoryName }}
        </option>
    @endforeach
</select>
person Kenneth    schedule 20.09.2017
comment
Я получил эту ошибку. Вызов функции-члена toArray () при нулевом значении - person Saengdaet; 20.09.2017
comment
Пожалуйста, проверьте, что я редактировал свой ответ, посмотрите коды в контроллере - person Kenneth; 20.09.2017
comment
зачем использовать поиск? если я использую $ post = App \ Post :: findOrFail ($ id) ;, как насчет моего $ post = new Post ();? .. Я тоже хочу хранить данные в таблице сообщений - person Saengdaet; 20.09.2017