hasManyThrough در جدول دسته بندی چند سطحی به چه شکل باید انجام بشه؟
الان دسته بندی های من سه سطحی هست،و واسه سطح یک با جدول محصولات از این پکیج استفاده کردم
https://github.com/staudenmeir/eloquent-has-many-deep
واسه سطح دو با محصولات به چه شکل میشه؟کسی کار کرده؟
این ارور رو میده
SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'categories' (SQL: select count(*) as aggregate from `categories` inner join `categories` on `categories`.`id` = `categories`.`parent_id` where `categories`.`parent_id` = 2)
<?php
namespace App\Models;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Support\Facades\DB;
use Staudenmeir\EloquentHasManyDeep\HasManyDeep;
use Staudenmeir\EloquentHasManyDeep\HasRelationships;
use Staudenmeir\EloquentHasManyDeep\HasTableAlias;
class Category extends Model
{
use Sluggable, HasRelationships, HasTableAlias;
protected $fillable = ['title', 'slug', 'seo_tag', 'seo_description', 'parent_id'];
public const IMAGE_SIZE = ['40', '100', '200'];
/**
* relation category with parent category.
* @return BelongsTo
*/
public function parent()
{
return $this->belongsTo(Category::class, 'parent_id');
}
/**
* relation category with children category.
* @return HasMany
*/
public function children()
{
return $this->hasMany(Category::class, 'parent_id');
}
/**
* relation category with allChildren category.
* @return HasMany
*/
public function allChildren()
{
return $this->children()->with('allChildren');
}
/**
* relation category with allParent category.
* @return BelongsTo
*/
public function allParent()
{
return $this->parent()->with('allParent');
}
/**
* check category has parent.
* @return bool
*/
public function hasParent()
{
return !!$this->parent;
}
/**
* check category has children.
* @return bool
*/
public function hasChildren()
{
return !!$this->children->count();
}
/**
* relation of great grandfather(level 1) category with products.
* @return HasManyDeep
*/
public function deepProducts()
{
return $this->hasManyDeep(Product::class, ['App\Models\Category as alias', Category::class], [
'parent_id', // Foreign key on the "category" table.
'parent_id', // Foreign key on the "category" table.
'category_id' // Foreign key on the "product" table.
], [
'id', // Local key on the "categories" table.
'id', // Local key on the "categories" table.
'id' // Local key on the "posts" table.
]);
}
/**
* relation grandfather(level 2) with products.
* @return HasManyThrough
*/
public function throughProducts()
{
return $this->hasManyDeep(Product::class, ['App\Models\Category as alias'], ['parent_id', 'category_id']);
}
/**
* relation father(level 3) with products.
* @return HasMany
*/
public function manyProducts()
{
return $this->hasMany(Product::class);
}
/**
* relation category with image morph one to one.
* @return MorphOne
*/
public function image()
{
return $this->morphOne(Image::class, 'imageable');
}
/**
* url param with slug instead id attribute.
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}
/**
* Return the sluggable configuration array for this model.
* create slug by title attribute.
* @return array
*/
public function sluggable(): array
{
return [
'slug' => [
'source' => 'title'
]
];
}
}
حل شد،با همون پکیج حل شد،از خود نویسندش به زور پرسیدم:))))))
اینم میذارم شاید کسی گیر کرد
درود
من با این پکیج کار نکردم اما مستندات بدی هم نداره.
اگر قصد شما پیاده سازی دسته بندیهای ساده و تو در تو هست... میتونید از پکیج Laravel-Categorizable هم استفاده کنید. توضیحات کامل در گفتگوی زیر:
https://roocket.ir/discuss/6117
@ali.bayat
ممنون از شما،پکیج خوبی نوشتید،ولی الان من خیلی از کارم گذشته و بخوام از اول این پکیج رو پیاده سازی کنم وقت میبره،همین رابطه رو نمیشه پیاده کرد؟یه جوری باید اسم تیبل تغییر کنه تا ارور نده،ینی استفاده از الیاس ها، ممنون میشم کمک کنید
چند نکته:
۱. رابطه BelongsToMany که در کدتون دارید رو به اشتراک بگذارید.. به اشتراک گذاشتن کدهایی که دارید باعث میشه دوستان بهتر بتونند کمک کنند
۲. یک رابطه چند به چند نیاز به pivot داره. پس چک کنید که آیا از پیوِت استفاده کردید یا نه؟
۳. در مورد alias در کوئری SQL
کوئری شما به شکل زیره:
select count(*) as aggregate
from `categories` inner join `categories`
on `categories`.`id` = `categories`.`parent_id`
where `categories`.`parent_id` = 2)
در صورتی که باید شبیه به زیر باشه تا alias ها درست رعایت شده باشند:
select count(*) as aggregate
from `categories` c1 inner join `categories` c2
on c1.`id` = c2.`parent_id`
where c1.`parent_id` = 2)
چنانچه از قبل موارد ۲ و ۳ رو رعایت کرده اید: مشکل میتونه از توابعی باشه که رابطه ها رو درونشون تعریف کردید.
@ali.bayat
سلام دوست گرامی،تشکر از پاسختون
این روابط من هست
/**
* relation category with parent category.
* @return BelongsTo
*/
public function parent()
{
return $this->belongsTo(Category::class, 'parent_id');
}
/**
* relation category with children category.
* @return HasMany
*/
public function children()
{
return $this->hasMany(Category::class, 'parent_id');
}
/**
* relation of grandpa(level 1) category with products.
* @return HasManyDeep
*/
public function deepProducts()
{
return $this->hasManyDeep(Product::class, ['App\Models\Category as alias', Category::class], [
'parent_id', // Foreign key on the "category" table.
'parent_id', // Foreign key on the "category" table.
'category_id' // Foreign key on the "product" table.
], [
'id', // Local key on the "countries" table.
'id', // Local key on the "users" table.
'id' // Local key on the "posts" table.
]);
}
/**
* relation father(level 2) with products.
* @return HasManyThrough
*/
public function throughProducts()
{
return $this->hasManyThrough(Category::class, Category::class, 'parent_id', 'parent_id');
}
دسته بندی ها همشون رابطه یک به چند دارن،ولی رابطه سطح دو با محصولات که با through هستش رو ارور میده
<?php
namespace App\Models;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Support\Facades\DB;
use Staudenmeir\EloquentHasManyDeep\HasManyDeep;
use Staudenmeir\EloquentHasManyDeep\HasRelationships;
use Staudenmeir\EloquentHasManyDeep\HasTableAlias;
class Category extends Model
{
use Sluggable, HasRelationships, HasTableAlias;
protected $fillable = ['title', 'slug', 'seo_tag', 'seo_description', 'parent_id'];
public const IMAGE_SIZE = ['40', '100', '200'];
/**
* relation category with parent category.
* @return BelongsTo
*/
public function parent()
{
return $this->belongsTo(Category::class, 'parent_id');
}
/**
* relation category with children category.
* @return HasMany
*/
public function children()
{
return $this->hasMany(Category::class, 'parent_id');
}
/**
* relation category with allChildren category.
* @return HasMany
*/
public function allChildren()
{
return $this->children()->with('allChildren');
}
/**
* relation category with allParent category.
* @return BelongsTo
*/
public function allParent()
{
return $this->parent()->with('allParent');
}
/**
* check category has parent.
* @return bool
*/
public function hasParent()
{
return !!$this->parent;
}
/**
* check category has children.
* @return bool
*/
public function hasChildren()
{
return !!$this->children->count();
}
/**
* relation of great grandfather(level 1) category with products.
* @return HasManyDeep
*/
public function deepProducts()
{
return $this->hasManyDeep(Product::class, ['App\Models\Category as alias', Category::class], [
'parent_id', // Foreign key on the "category" table.
'parent_id', // Foreign key on the "category" table.
'category_id' // Foreign key on the "product" table.
], [
'id', // Local key on the "categories" table.
'id', // Local key on the "categories" table.
'id' // Local key on the "posts" table.
]);
}
/**
* relation grandfather(level 2) with products.
* @return HasManyThrough
*/
public function throughProducts()
{
return $this->hasManyDeep(Product::class, ['App\Models\Category as alias'], ['parent_id', 'category_id']);
}
/**
* relation father(level 3) with products.
* @return HasMany
*/
public function manyProducts()
{
return $this->hasMany(Product::class);
}
/**
* relation category with image morph one to one.
* @return MorphOne
*/
public function image()
{
return $this->morphOne(Image::class, 'imageable');
}
/**
* url param with slug instead id attribute.
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}
/**
* Return the sluggable configuration array for this model.
* create slug by title attribute.
* @return array
*/
public function sluggable(): array
{
return [
'slug' => [
'source' => 'title'
]
];
}
}
حل شد،با همون پکیج حل شد،از خود نویسندش به زور پرسیدم:))))))
اینم میذارم شاید کسی گیر کرد
درود
پس مشکل از متد throughProducts بود که باید به مدل Product پوینت میکرد و نه به خود Category :)
پیروز باشید
@ali.bayat
بله، مشکل همین بود:))
ولی این پکیجه خیلی خوب بود، حال داد
البته این تریت این کارو انجام میده ها
HasTableAlias
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟