Создание отношения в той же таблице не работает в laravel - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть таблица категорий, для которой sql это файл миграции:

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('slug')->unique();
        $table->boolean('is_parent')->default(true);
        $table->unsignedBigInteger('parent')->nullable();
        $table->foreign('parent')->references('id')->on('categories')->onDelete('SET NULL');
        $table->integer('priority');
        $table->timestamps();
    });
}

, и я также создал следующую функцию в модели категорий для отношений:

public function categoryName(){
    return $this->belongsTo('App\Models\Category'); 
}

Но , когда я пытаюсь сделать это <td>{{ $categoryList->categoryName->name }}</td>, выдается следующая ошибка

Попытка получить свойство необъекта (Представление: C: \ xampp \ htdocs \ projects \ gokarna \ resources \ views \ admin \ pages \ category.blade. php) Но он отлично работает с таблицей сообщений, куда я загружаю категорию сообщений.

И вот что у меня в контроллере:

public function index()
{
    $parent = $this->category->where('is_parent', 1)->get();
    $allCategories = $this->category->get();

    return view('admin.pages.categories', compact('parent', 'allCategories'));
}

Что такое логика c за внешним ключом, не работающая с той же таблицей?

Редактировать $categoryList = $allCategories, поэтому я получаю категории. Я попытался переименовать столбец parent в category_id, он дает json данных, когда я делаю {{ $categoryList->categoryName}}, но не выдает вывод, когда я делаю {{ $categoryList->categoryName->name }}.

Я также попытался переименовать categoryName в category, он делает то же самое, что и выше, дает json data с {{ $categoryList->category}}, но выдает ошибку, когда я делаю это {{ $categoryList->categoryName->name}}.

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Измените свой метод так, чтобы он был таким:

public function categoryName(){
    return $this->belongsTo('App\Models\Category','parent'); 
}

Без добавления внешнего ключа 'parent' он будет использовать имя метода для получения родительского объекта.

Это всегда хорошо Практикуйтесь всякий раз, когда вы сталкиваетесь с такой проблемой, чтобы dd запрос или результаты

, чтобы вы могли отладить его следующим образом (напишите это где-нибудь, где вы можете его протестировать): dd(Category::first()->categoryName()->toSql()); это должно дать вам подсказку что происходит


Вы получаете эту ошибку:

Попытка получить свойство необъекта (Представление: C: \ xampp \ htdocs \ projects \ gokarna \ resources \ views \ admin \ pages \ateg.blade. php) Но он отлично работает с таблицей сообщений, из которой я выбираю категорию сообщений.

, поскольку, по вашему мнению, ...->categoryName->... равно нулю таким образом делая ->categoryName->name недействительным

Плюс, в вашем контроллере вы не отправляете $categoryList, я не вижу там этого:

public function index()
{
    $parent = $this->category->where('is_parent', 1)->get();
    $allCategories = $this->category->get();
    // no $categoryList sent here.. ?
    return view('admin.pages.categories', compact('parent', 'allCategories'));
}

Но так как это не не показывать ошибку, что переменная $ categoryList не определена, тогда она где-то есть, но вы забыли людям Что касается нас, то в вашем вопросе есть что-то неясное, однако.


Я бы посоветовал вам изменить свой код на

...
$table->unsignedBigInteger('category_id')->nullable(); // Because `parent` is a preserved mysql keyword
$table->foreign('category_id')->references('id')->on('categories')->onDelete('SET NULL');
...

Категория Модель

public function category(){
    # In this case here, Laravel will look for column of method_name + _id
    # so it will look for ...category_id without manually defining the 
    # Foreign key
    return $this->belongsTo('App\Models\Category');
}

Тогда вы можете легко получить его в своем виде, например:

<td>{{ $whateverCategoryObjectThisIs->category->name }}</td>

Вы можете включить функцию optional, чтобы предотвратить его выброс, если родительская категория не установлена ​​так

<td>{{ optional($whateverCategoryObjectThisIs->category)->name }}</td>
0 голосов
/ 09 февраля 2020

Я сделал следующее, чтобы получить ожидаемый ответ:

{{ $categoryList->category['name']}}

Как я уже говорил в своих комментариях, я получил объект, когда набрал {{ $categoryList->category}}, но не смог получить результат, выполнив {{ $categoryList->category->name}}.

Дело в том, что если какой-либо объект не содержит какого-либо атрибута, и вы пытаетесь использовать этот атрибут, он выдаст вам ошибку. Но в случае массива, если вы используете его в качестве ключа массива, он будет отображать ноль.

...