I have eloquent model to store specific car brand model years:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentBuilder;
use IlluminateDatabaseEloquentModel;
class CarModel extends Model
{
protected $fillable = ['brand_id', 'name'];
public function brand()
{
return $this->belongsTo(CarBrand::class, 'brand_id');
}
public function years()
{
return $this->hasMany(CarModelYear::class, 'model_id');
}
public function classifications()
{
return $this->hasMany(CarClassification::class, 'model_id');
}
public function scopeWithCarStats(Builder $query)
{
$query->withCount([
'classifications as totalClassifications',
]);
$carClasses = CarClass::pluck('id');
foreach ($carClasses as $carClassId) {
$query->withCount([
"classifications as car_class_{$carClassId}" => function (Builder $query) use ($carClassId) {
$query->where('class_id', $carClassId);
}
]);
}
$carYears = CarModelYear::query()
->select('year')
->distinct()
->orderBy('year', 'asc')
->pluck('year');
if($carYears->isNotEmpty()) {
foreach ($carYears as $year) {
$query->selectRaw("
(SELECT COUNT(*)
FROM car_classifications
JOIN car_model_years ON car_classifications.year_id = car_model_years.id
WHERE car_classifications.model_id = car_models.id
AND car_model_years.year = ?) as car_model_year_{$year}
", [$year]);
}
}
}
}
class CarModelYear extends Model
{
protected $fillable = ['model_id', 'year'];
public function model()
{
return $this->belongsTo(CarModel::class, 'model_id');
}
public function classifications()
{
return $this->hasMany(CarClassification::class, 'year_id');
}
public function scopeWithCarStats(Builder $query)
{
$query->withCount([
'classifications as totalClassifications',
]);
$carClasses = CarClass::pluck('id');
foreach ($carClasses as $carClassId) {
$query->withCount([
"classifications as car_class_{$carClassId}" => function (Builder $query) use ($carClassId) {
$query->where('class_id', $carClassId);
}
]);
}
}
}
Here is my CarModel resource form:
public static function form(Form $form): Form
{
return $form
->schema([
FormsComponentsSection::make()
->columns()
->schema([
FormsComponentsTextInput::make('name')
->label('Model Name')
->required()
->maxLength(255),
FormsComponentsSelect::make('brand_id')
->label('Car Brand')
->relationship('brand', 'name')
->searchable()
->preload()
->required(),
FormsComponentsTagsInput::make('years')
->label('Model Years')
->placeholder('Enter model years, example: 2020, 2021, 2022')
->required()
->dehydrated(false)
->unique()
->splitKeys([',', ' '])
->hint('Eneter model years with comma or space'),
])
]);
}
I tried debugging in CreateCarModel
method named mutateFormDataBeforeCreate
but not triggered anything:
protected function mutateFormDataBeforeCreate(array $data): array
{
if(array_key_exists('years', $data)) {
dd($data['years']);
}
return $data;
}
I get error when try create some model with specific years:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'years' in 'where clause' (Connection: mysql, SQL: select count(*) as aggregate from `car_models` where `years` = 2024)
How I can correctly use TagsInput component to store car model years?