Ларавель 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();
});
}
Отредактируйте свой вопрос, а также поделитесь файлом миграции для модели Products
.
Попробуйте dd($products) и проверьте, правильно ли загружены отношения, и можете ли вы поделиться здесь миграциями категорий и подкатегорий :), я думаю, что проблема здесь в отношениях.
Кажется, что в предоставленном вами SQL имя таблицы — ala_products
, но в вашей модели продукта вы установили $table
на products
. Почему?
@Субха готово и спасибо :)
@DishanSachin в настройках config/database.php, которые у меня есть в соединениях: 'prefix' => 'ala_', laravel автоматически работает с этим :)
@MichaelGrznár, Что ты получил, делая dd($products)
?
@MichaelGrznár, убедитесь, что имя созданной таблицы после запуска миграции — categories
и subcategories
, а не category
и subcategory
. Потому что по умолчанию файлы миграции генерируют имя во множественном числе в соответствии с соглашением об именах. Также добавьте это в свой Product
файл миграции $table->foreign('subcategory')->references('id')->on('subcategory');
, удалив id
. А также проверьте, является ли сгенерированное имя таблицы subcategory
или subcategories
.
@Subha imgur.com/a/fDY5ixn Он возвращает ноль, но я не знаю почему, потому что когда я смотрю в базе данных, продукт находится в базе данных и правильно соответствует другим ключам, то есть категориям и подкатегории :( Я удалил идентификатор из файла миграции и запустил его снова, к сожалению, проблема не устранена.
@MichaelGrznár, понятно, я опубликовал свой ответ. Пожалуйста, проверьте и дайте мне знать, остались ли какие-либо проблемы после реализации моих решений. Спасибо
Вместо повторного запуска миграции вы также можете создать новый файл миграции, чтобы изменить имя столбца foreign_key
, как предложено в моем ответе @MichaelGrznár.
Попытка прочитать свойство «имя» в 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
Попробуй это. это точно сработает.
Н:Б:-
category
и subcategory
, а не categories
и subcategories
соответственно.Работает! Спасибо <3 небольшие ошибки в строке "$table->foreign('subcategory_id')->references('id')>on('subcategory');" отсутствует дефис и $table->unsignedInteger('category'); и $table->unsignedInteger('подкатегория'); должно выглядеть так $table->unsignedInteger('category_id'); и $table->unsignedInteger('subcategory_id'); СПАСИБО МНОГО!
@MichaelGrznár, всегда пожалуйста. Из-за спешки я допустил эту ошибку. Кстати, спасибо за исправление.
В вашем ProductController попробуйте
dd($products)
и проверьте, действительно ли существует столбецname
? Также проверьте, каким должно быть имя вашей таблицыproducts
илиala_products
?