У меня сейчас есть следующие настройки:
Категория, подкатегория, бизнес, расширение и модели продуктов.
- A
Category
имеет много SubCategory
s
- A
SubCategory
имеет много Business
s
- A
Business
может иметь один Enhancement
- A
Enhancement
должен иметь один Product
Продуктом может быть расширенный список, премиум-лист или дополнительные функции.
Если компания внесла в расширенный или премиум-лист листинг, он заносится в таблицу расширений.
Итак, продукт # 1 = список премиум. Продукт № 2 = расширенный список.
Я хочу вернуть все предприятия для выбранной подкатегории, сгруппировав их по продукту, к которому прикреплено расширение. Если у бизнеса есть улучшение, я хочу рандомизировать заказ. Если у предприятия нет продукта, я хочу заказать его по имени в порядке ASC.
Итак, в результате я ожидаю получить полный список всех предприятий, в том числе компаний с Премиум-листингом, перечисленных сначала в случайном порядке. Тогда все предприятия с расширенным списком в случайном порядке. Затем все остальные предприятия, которые не имеют улучшения, в алфавитном порядке.
В настоящее время у меня есть все предприятия, перечисленные в порядке имен со следующим кодом:
SubCategory::where('slug', $subCategory)->where('category_id', $category->id)
->with(['businesses' => function($query) {
$query->orderBy('name', 'ASC');
}])->firstOrFail();
Категория модели:
class Category extends Model
{
public function subCategories()
{
return $this->hasMany('\App\SubCategory');
}
}
Модель подкатегории:
class SubCategory extends Model
{
public function businesses()
{
return $this->hasMany('\App\Business');
}
public function category()
{
return $this->belongsTo('\App\Category');
}
}
Бизнес-модель:
class Business extends Model
{
public function subCategory()
{
return $this->belongsTo('\App\SubCategory');
}
public function enhancements()
{
return $this->hasMany('\App\Enhancement');
}
}
Модель улучшения:
class Enhancement extends Model
{
public function business()
{
return $this->belongsTo('\App\Business');
}
public function product()
{
return $this->belongsTo('\App\Product');
}
}
Модель товара:
class Product extends Model { }
Миграция:
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique();
$table->string('slug')->unique();
$table->string('featured_image');
$table->text('description');
$table->unsignedInteger('sort_order')->nullable();
$table->timestamps();
$table->softDeletes();
});
Schema::create('sub_categories', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('category_id');
$table->string('name')->unique();
$table->string('slug')->unique();
$table->string('featured_image');
$table->text('description')->nullable();
$table->unsignedInteger('sort_order')->nullable();
$table->timestamps();
$table->softDeletes();
$table->foreign('category_id')->references('id')->on('categories');
});
Schema::create('businesses', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('resort_id');
$table->unsignedInteger('sub_category_id');
$table->string('name');
$table->string('slug')->unique();
$table->string('logo')->nullable();
$table->text('description');
$table->text('content')->nullable();
$table->string('county')->nullable();
$table->string('postcode')->nullable();
$table->timestamps();
$table->foreign('resort_id')->references('id')->on('resorts');
$table->foreign('sub_category_id')->references('id')->on('sub_categories');
});
Schema::create('enhancements', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('business_id');
$table->unsignedInteger('product_id');
$table->dateTime('from_date');
$table->dateTime('to_date');
$table->timestamps();
$table->softDeletes();
$table->foreign('business_id')->references('id')->on('businesses');
$table->foreign('product_id')->references('id')->on('products');
});
Schema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('slug')->unique();
$table->string('image');
$table->text('description');
$table->float('yearly_price');
$table->float('monthly_price');
$table->timestamps();
});