php - 在 Laravel 5.8 中根据所选类别显示产品?
问题描述
下面的代码是我的类别列表 ( product_categories
)、产品列表 ( products
) 和分配给产品的类别 ( product_selected_categories
)。
我想展示我的产品以及它添加到的类别。我正在尝试使用以下代码执行此操作:
Product::findOrFail($id)
但是这段代码不起作用。该代码仅显示产品,不显示产品所属类别的信息。
我该如何解决?
我的项目在 Laravel 5.8 中。
- 移民
Schema::create('product_categories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('company_id')->unsigned();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->char('enable', 1)->default(0);
$table->string('name', 85)->nullable();
$table->string('url_address', 160);
$table->integer('level')->default(0);
//$table->bigInteger('parent_id')->default(0);
//$table->bigInteger('parent_id')->nullable();
$table->unsignedBigInteger('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('product_categories')->onDelete('cascade');
$table->bigInteger('number')->default(0);
$table->timestamps();
$table->engine = "InnoDB";
$table->charset = 'utf8mb4';
$table->collation = 'utf8mb4_unicode_ci';
});
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('company_id')->unsigned();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
//$table->bigInteger('category_id')->unsigned();
//$table->foreign('category_id')->references('id')->on('product_categories');
$table->smallInteger('id_delivery_vat')->unsigned();
$table->foreign('id_delivery_vat')->references('id')->on('vat');
$table->smallInteger('id_product_vat')->unsigned();
$table->foreign('id_product_vat')->references('id')->on('vat');
$table->bigInteger('id_producer')->unsigned();
//$table->foreign('id_producer')->references('id')->on('product_producers');
$table->string('name', 120)->nullable();
$table->string('qr_code', 120)->nullable();
$table->string('oe_code', 120)->nullable();
$table->char('enable', 1)->default(0);
$table->char('promo', 1)->default(0);
$table->longText('description')->nullable();
$table->decimal('product_price', 9, 2)->default(0);
$table->decimal('promo_product_price', 9, 2)->default(0);
$table->decimal('product_delivery_price', 9, 2)->default(0);
$table->unsignedInteger('quantity')->default(0);
$table->string('url_address', 160);
$table->timestamps();
$table->engine = "InnoDB";
$table->charset = 'utf8mb4';
$table->collation = 'utf8mb4_unicode_ci';
});
Schema::create('product_selected_categories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('category_id')->unsigned()->index();
$table->foreign('category_id')->references('id')->on('product_categories');
$table->bigInteger('subcategory1_id')->default(0);
$table->bigInteger('parent_subcategory1_id')->default(0);
$table->bigInteger('subcategory2_id')->default(0);
$table->bigInteger('parent_subcategory2_id')->default(0);
$table->bigInteger('subcategory3_id')->default(0);
$table->bigInteger('parent_subcategory3_id')->default(0);
$table->bigInteger('subcategory4_id')->default(0);
$table->bigInteger('parent_subcategory4_id')->default(0);
$table->bigInteger('subcategory5_id')->default(0);
$table->bigInteger('parent_subcategory5_id')->default(0);
$table->bigInteger('subcategory6_id')->default(0);
$table->bigInteger('parent_subcategory6_id')->default(0);
$table->bigInteger('subcategory7_id')->default(0);
$table->bigInteger('parent_subcategory7_id')->default(0);
$table->bigInteger('subcategory8_id')->default(0);
$table->bigInteger('parent_subcategory8_id')->default(0);
$table->bigInteger('subcategory9_id')->default(0);
$table->bigInteger('parent_subcategory9_id')->default(0);
$table->bigInteger('product_id')->unsigned()->index();
$table->foreign('product_id')->references('id')->on('products');
});
- 楷模
class Product extends Model
{
use scopeActiveTrait;
protected $fillable = ['company_id', 'id_delivery_vat', 'id_product_vat', 'id_producer', 'name', 'qr_code', 'oe_code', 'enable', 'promo', 'description', 'product_price', 'promo_product_price', 'product_delivery_price', 'quantity', 'url_address'];
protected $quarded = ['id'];
public $timestamps = true;
public function categories()
{
return $this->belongsToMany(Category::class, 'product_selected_categories', 'product_id', 'category_id');
}
}
class ProductCategory extends Model
{
use scopeActiveTrait;
protected $guarded = ['id'];
protected $fillable = ['company_id', 'enable', 'name', 'url_address', 'level', 'parent_id', 'number'];
public $timestamps = true;
//protected $table = 'products_category';
public function parent()
{
return $this->belongsTo('App\ProductCategory', 'parent_id', 'id');
}
public function children()
{
return $this->hasMany('App\ProductCategory', 'id', 'parent_id');
}
public function products()
{
return $this->belongsToMany(Product::class, 'product_selected_categories', 'category_id', 'product_id');
}
}
class ProductSelectedCategory extends Model
{
protected $quarded = ['id'];
protected $fillable = ['subcategory1_id', 'parent_subcategory1_id', 'category_id', 'subcategory2_id', 'parent_subcategory2_id', 'subcategory3_id', 'parent_subcategory3_id', 'subcategory4_id', 'parent_subcategory4_id', 'subcategory5_id', 'parent_subcategory5_id', 'subcategory6_id', 'parent_subcategory6_id', 'subcategory7_id', 'parent_subcategory7_id', 'subcategory8_id', 'parent_subcategory8_id', 'subcategory9_id', 'parent_subcategory9_id', 'product_id' ];
public $timestamps = false;
}
解决方案
如果您知道您将需要产品的类别,您可以使用 QueryBuilder 的函数预先加载相关模型:with()
$product = Product::with('categories')->findOrFail($id);
如果您需要预先加载多个关系,可以将数组传递给with()
:
$product = Product::with(['categories', ...])->findOrFail($id);
但是,如果您可能不需要产品的类别,您可以使用以下load()
函数延迟加载类别:
$product = Product::findOrFail($id);
// ... some time later you end up needing the Categories...
$product->load('categories');
同样,如果需要,您可以将数组传递给load()
:
$product->load(['categories', ...]);
推荐阅读
- mongodb - 如何取消“查找”中的关系?
- reactjs - Reactjs:如何渲染从道具传递的HTML标签
- computer-science - 乘法位
- android - 后台服务在从 MIUI 中的最近清除时被杀死
- wordpress - .htaccess wordpress 子站点之间的多站点重定向
- android - 当我使用 firebase 中的哈希映射更新我的值时,我当前的活动崩溃了
- php - Fuel\Core\PhpErrorException [警告]:array_key_exists():第一个参数应该是字符串或整数
- python - 有没有办法限制 Ray 对象存储的最大内存使用量
- angularjs - 保护 Angular JS 表达式
- php - 使用laravel中的长度感知分页器搜索结果分页太慢