Свойство многие ко многим возвращает null Laravel - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть две таблицы: booksmandala_originals и blog_categories. Соотношение между этими двумя соотношениями много-много, и имя сводной таблицы bksm_original_categories. Все остальное полностью работает нормально, например, данные сохраняются, обновляются, но когда я пытаюсь получить данные из blog_categories, они дают мне ноль, даже если они имеют данные типа

В моем

BooksmandalaOriginal. php

 public function blog_categories()
    {
        return $this->belongsToMany('App\Models\Admin\BlogCategory', 'bksm_original_categories','bksm_originals_id','category_id')->withTimestamps();
    }

В моем блоге. php

public function bksm_originals()
    {
        return $this->belongsToMany('App\Models\Admin\BooksmandalaOriginal','bksm_original_categories','bksm_originals_id','category_id')->withTimestamps();
    }

Моя сводная миграция выглядит следующим образом.

 Schema::create('bksm_original_categories', function (Blueprint $table) {
            $table->bigIncrements('id');

            $table->unsignedInteger('bksm_originals_id');
            $table->unsignedInteger('category_id');

            $table->foreign('bksm_originals_id')->references('id')->on('booksmandala_originals')->onDelete('cascade');
            $table->foreign('category_id')->references('id')->on('blog_categories')->onDelete('cascade');

            $table->timestamps();
        }

);

Когда я пытаюсь получить оригиналы bookmandala из таких категорий блогов, как это

$category = BlogCategory::where('id',$id)->first();
$category->bksm_originals; 
// It return empty array 

Но если я так и делаю.

$blog = BooksmandalaOriginal::find(1);
$blog->blog_categories;
// It return correct values 

Я также пытался сделать это

$category = BlogCategory::find($id);
$blogs = $category->whereHas('bksm_originals', function($query) use ($category){
      $query->whereIn('id',$category->id);
})->get();

Это дает мне эту ошибку

Argument 1 passed to Illuminate\Database\Query\Builder::cleanBindings() must be of the type array, int given

1 Ответ

0 голосов
/ 02 апреля 2020

Ваши отношения в категории блога не имеют правильных ключей.

Прочитайте это: https://laravel.com/docs/7.x/eloquent-relationships#many-ко-многим

Как уже упоминалось ранее, чтобы определить имя таблицы присоединяемой таблицы отношений, Eloquent соединит два связанных имени модели в алфавитном порядке. Тем не менее, вы можете изменить это соглашение. Вы можете сделать это, передав второй аргумент в метод ownToMany

В дополнение к настройке имени присоединяемой таблицы, вы также можете настроить имена столбцов ключей в таблице, передав дополнительные аргументы в ownToMany. метод. Третий аргумент - это имя внешнего ключа модели, для которой вы определяете отношение, а четвертый аргумент - это имя внешнего ключа модели, к которой вы присоединяетесь

Так что в вашем случае:

public function bksm_originals()
{
    return $this->belongsToMany('App\Models\Admin\BooksmandalaOriginal','bksm_original_categories','category_id','bksm_originals_id')->withTimestamps();
}

Также, чтобы избежать ошибок такого рода, вы должны стараться следовать Laravel соглашениям о присвоении имен.

...