【问题标题】:Create Model with HasMany relation using Repository Pattern使用存储库模式创建具有 HasMany 关系的模型
【发布时间】:2019-12-11 10:58:42
【问题描述】:

我正在尝试实现存储库模式并使用 create 方法保存关系,如下所示。

abstract class EloquentRepository implements Repository {
    public function create($data)
    {
        return $this->model->create($data);
    }
}

在我的控制器中,我已经注入了存储库:

public function __construct(SubscriberRepository $subscriberRepository,
                                SubscribableRepository $subscribableRepository)
    {
        $this->subscriberRepository = $subscriberRepository;
        $this->subscribableRepository = $subscribableRepository;
    }

我的存储方法如下:

public function store(CreateSubscriberRequest $request): JsonResponse
    {
        $subscribable = $this->subscribableRepository->findByIdentifier($request->input('type'))
            ->firstOrFail();

                $attributes = [
            'name' => $request->input('name'),
            'email' => $request->input('email')
        ];

        $subscriber = $this->subscriberRepository->create($attributes);
    }

订阅者模型

public function subscribable()
    {
        return $this->belongsTo(Subscribable::class, 'subscribable_id');
    }

可订阅模型

public function subscribers()
    {
        return $this->hasMany(Subscriber::class);
    }

我的问题General error: 1364 Field 'subscribable_id' doesn't have a default value是因为subscribable_id是外键,没有在create方法中设置。

如何关联可订阅模型,设置 subscribable_id?我不认为在可填充属性中设置 subscribable_id 是解决这个问题的方法。

非常感谢。

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    Laravel 提供了使用相关模型实例保存关系的功能。 因此,您可以通过在关系上调用 create 方法来保存关系,如下所示:

    public function store(CreateSubscriberRequest $request): JsonResponse
    {
        $subscribable = $this->subscribableRepository->findByIdentifier($request->input('type'))
            ->firstOrFail();
    
        $attributes = [
            'name' => $request->input('name'),
            'email' => $request->input('email')
        ];
    
        $subscribable->subscribers()->create($attributes);
    }
    

    laravel doc on relationship

    【讨论】:

    • 非常感谢!我是否认为存储数据不是存储库的责任?
    • 存储库为您提供了额外的抽象层,通过存储库保存数据没有害处
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多