Я пытаюсь добавить макрос для моего построителя запросов, чтобы у меня могло быть что-то вроде этого
$person = Person::first();
$person->activity()->log("Newest Activity");
К сожалению, моя реализация выдает ошибку
Общая ошибка: 1364Поле 'person_id' не имеет значения по умолчанию
Вот моя реализация, у меня есть модель 2 класса,
один - модель человека
public class Person extends Model {
public function activity()
{
return $this->hasMany(Activity::class, "person_id");
}
}
и ActivityLog Model
public class ActivityLog extends Model {
public function newEloquentBuilder($query)
{
$builder = parent::newEloquentBuilder($query);
$builder->macro('log', function (Builder $builder, $value) use ($query) {
return $builder->getModel()
->newInstance([
'person_id' => // How to get the id from relationship
'details' => $value
])
->save();
});
return $builder;
}
}
Я знаю, как это сделать лавинообразно, но я хочу не указывать ключи, это одна из причин, почему я делаю это.
Как мне получить доступ к его значению person_id из отношения, чтобы моя реализация работала?
Для получения дополнительной информации, моя таблица, так выглядит моя таблица
Person Table
| Column | Not Null | Auto Increment |
|--------------|----------|----------------|
| id | ✓ | ✓ |
| first_name | ✓ | |
| last_name | ✓ | |
| created_at | | |
| updated_at | | |
Activity Log Table
| Column | Not Null | Auto Increment |
| id | ✓ | ✓ |
| details | ✓ | |
| person_id | ✓ | |
| created_at | | |
| updated_at | | |
Моя миграция для журнала активности
Schema::create('activity_log', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('person_id');
$table->string('details');
$table->timestamps();
});
Для кого-то, кто думает, почему я это делаю,
это вторая причина, почему я планирую использоватьmeta_key, meta_value
вот пример класса
class FavoriteAnimalInfo extends Model
{
//
protected $table = "person_meta";
protected $meta_key_name = 'favorite_animal';
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->meta_key = $model->meta_key_name;
});
}
public function newEloquentBuilder($query)
{
$builder = parent::newEloquentBuilder($query);
$builder->macro('add', function (Builder $builder, $value) {
return $builder->getModel()
->newInstance(['meta_value' => $value])
->save();
});
return $builder;
}
}
Теперь мой класс Person может иметьЧто-то вроде этого
public class Person extends Model {
public function favoriteAnimal()
{
return $this->hasMany(FavoriteAnimalInfo::class, "person_id");
}
}
И теперь я могу EasyLy Сделать это
$person = Person::first();
$person->favoriteAnimal()->add("dog");
$person->favoriteAnimal()->add("cat");
$person->favoriteAnimal()->add("chicken");