Laravel 11 Попытка прочитать свойство «имя» в int

Ларавель 11! Когда я пытаюсь перечислить продукты в шаблоне блейда, я получаю сообщение об ошибке «Попытка прочитать свойство «имя» в int»

Обновлено: конечно, я также отправляю экспорт таблицы продуктов, внешние ключи определены.

В шаблоне лезвия я передаю данные следующим образом

<tbody>
@foreach($products as $product)
    <tr>
        <td>{{ $product->name }}</td>
        <td>{{ $product->category->name }}</td>
        <td>{{ $product->subcategory->name }}</td>
    </tr>
@endforeach
</tbody>

Мои продуктыController.php

public function create(): View
{
    $products = Products::with(['category', 'subcategory'])->get();
    return view('products', compact('products'));
}

Модели Продукты, Категория, Подкатегория

class Products extends Model
{
    use HasFactory;

    protected $table = 'products';

    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }

    public function subcategory(): BelongsTo
    {
        return $this->belongsTo(SubCategory::class);
    }
}

class SubCategory extends Model
{
    use HasFactory;

    protected $table = 'subcategory';

    public function products(): HasMany
    {
        return $this->hasMany(Products::class, 'subcategory', 'id');
    }

    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class, 'id_category', 'id');
    }
}

class Category extends Model
{
    use HasFactory;

    protected $table = 'category';

    public function subCategories(): HasMany
    {
        return $this->hasMany(SubCategory::class, 'id_category');
    }

    public function products(): HasMany
    {
        return $this->hasMany(Products::class, 'category', 'id');
    }
}

Я в растерянности, я действительно не знаю, что делать дальше. Я на 90% уверен, что допускаю ошибку где-то в моделях, при определении связей между таблицами. Но я не уверен на 100%. Хуже всего то, что ни Google Gemini, ни

CREATE TABLE `ala_products` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `category` int(10) unsigned NOT NULL,
  `subcategory` bigint(20) unsigned NOT NULL,
  `color_1` varchar(10) NOT NULL,
  `color_2` varchar(10) NOT NULL,
  `min_size` smallint(6) NOT NULL DEFAULT 0,
  `max_size` smallint(6) NOT NULL DEFAULT 0,
  `order_x` smallint(6) NOT NULL DEFAULT 0,
  `active` enum('0','1') NOT NULL DEFAULT '1',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ala_products_category_foreign` (`category`),
  KEY `ala_products_subcategory_foreign` (`subcategory`),
  CONSTRAINT `ala_products_category_foreign` FOREIGN KEY (`category`) REFERENCES `ala_category` (`id`),
  CONSTRAINT `ala_products_subcategory_foreign` FOREIGN KEY (`subcategory`) REFERENCES `ala_subcategory` (`id`)

public function up(): void
{
    Schema::create('products', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name', 255);
        $table->string('slug', 255);

        $table->unsignedInteger('category');
        $table->foreign('category')->references('id')->on('category');

        $table->unsignedBigInteger('subcategory');
        $table->foreign('subcategory')->references('id')->on('subcategory', 'id');

        $table->string('color_1', 10);
        $table->string('color_2', 10);
        $table->smallInteger('min_size')->default(0);
        $table->smallInteger('max_size')->default(0);
        $table->smallInteger('order_x')->default(0);
        $table->enum('active', ['0', '1'])->default('1');
        $table->timestamps();
    });
}

В вашем ProductController попробуйте dd($products) и проверьте, действительно ли существует столбец name? Также проверьте, каким должно быть имя вашей таблицы products или ala_products?

Subha 05.08.2024 12:55

Отредактируйте свой вопрос, а также поделитесь файлом миграции для модели Products.

Subha 05.08.2024 13:02

Попробуйте dd($products) и проверьте, правильно ли загружены отношения, и можете ли вы поделиться здесь миграциями категорий и подкатегорий :), я думаю, что проблема здесь в отношениях.

henrikhannewijk 05.08.2024 13:33

Кажется, что в предоставленном вами SQL имя таблицы — ala_products, но в вашей модели продукта вы установили $table на products. Почему?

Dishan Sachin 05.08.2024 13:37

@Субха готово и спасибо :)

Michael Grznár 05.08.2024 16:23

@DishanSachin в настройках config/database.php, которые у меня есть в соединениях: 'prefix' => 'ala_', laravel автоматически работает с этим :)

Michael Grznár 05.08.2024 16:24

@MichaelGrznár, Что ты получил, делая dd($products)?

Subha 05.08.2024 16:25

@MichaelGrznár, убедитесь, что имя созданной таблицы после запуска миграции — categories и subcategories, а не category и subcategory. Потому что по умолчанию файлы миграции генерируют имя во множественном числе в соответствии с соглашением об именах. Также добавьте это в свой Product файл миграции $table->foreign('subcategory')->references('id')->on('subcat‌​egory');, удалив id. А также проверьте, является ли сгенерированное имя таблицы subcategory или subcategories.

Subha 05.08.2024 16:37

@Subha imgur.com/a/fDY5ixn Он возвращает ноль, но я не знаю почему, потому что когда я смотрю в базе данных, продукт находится в базе данных и правильно соответствует другим ключам, то есть категориям и подкатегории :( Я удалил идентификатор из файла миграции и запустил его снова, к сожалению, проблема не устранена.

Michael Grznár 05.08.2024 17:06

@MichaelGrznár, понятно, я опубликовал свой ответ. Пожалуйста, проверьте и дайте мне знать, остались ли какие-либо проблемы после реализации моих решений. Спасибо

Subha 05.08.2024 17:27

Вместо повторного запуска миграции вы также можете создать новый файл миграции, чтобы изменить имя столбца foreign_key, как предложено в моем ответе @MichaelGrznár.

Subha 05.08.2024 17:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
11
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попытка прочитать свойство «имя» в int

Это naming-conventon проблема.

У вас уже есть столбец category и subcategory в таблице products, а в таблице product-model вы также определили связь с тем же именем, т. е. category() & subcategory(). По этой причине вы получаете упомянутую выше ошибку при доступе к значению связанной модели либо с помощью этого $product->category->name, либо с помощью этого $product->subcategory->name.

Решение:-

Вам необходимо переопределить файл миграции продуктов. Просто внесите эти изменения и снова запустите файл миграции, добавив _id к foreign_key .

    $table->unsignedInteger('category_id');
    $table->foreign('category_id')->references('id')->on('category'); // properly mapped the related table based on name

    $table->unsignedBigInteger('subcategory_id');
    $table->foreign('subcategory_id')->references('id')->on('subcategory'); // properly mapped the related table based on name

Попробуй это. это точно сработает.

Н:Б:-

  1. Убедитесь, что имя таблицы — category и subcategory, а не categories и subcategories соответственно.

Работает! Спасибо <3 небольшие ошибки в строке "$table->foreign('subcategory_id')->references('id')>on('sub‌​category');" отсутствует дефис и $table->unsignedInteger('category'); и $table->unsignedInteger('подкатегория'); должно выглядеть так $table->unsignedInteger('category_id'); и $table->unsignedInteger('subcategory_id'); СПАСИБО МНОГО!

Michael Grznár 05.08.2024 17:45

@MichaelGrznár, всегда пожалуйста. Из-за спешки я допустил эту ошибку. Кстати, спасибо за исправление.

Subha 05.08.2024 20:12

Другие вопросы по теме