Макрос Eloquent Builder, получите идентификатор отношения - PullRequest
1 голос
/ 13 октября 2019

Я пытаюсь добавить макрос для моего построителя запросов, чтобы у меня могло быть что-то вроде этого

$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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...