InfyOm Generator中的关系

时间:2016-10-28 19:43:58

标签: laravel laravel-5.3

我有News和NewsCategories模型,我已经使用关系选项生成了CRUD。

我现在需要为新闻模型生成一个选择列表,以选择它所属的NewsCategory。

我知道如何在模型中执行此操作,但不知道如何使用存储库模式执行此操作。

我无法在文档中看到任何示例,因此我们将不胜感激。

由于

NewsRepository

/**
     * Configure the Model
     **/
    public function model()
    {
        return News::class;
    }

新闻模式

/**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     **/
    public function newsCategory()
    {
        return $this->belongsTo(NewsCategory::class);
    }

新闻控制器

/**
     * Show the form for creating a new News.
     *
     * @return Response
     */
    public function create()
    {
        return view('news.create');
    }

    /**
     * Store a newly created News in storage.
     *
     * @param CreateNewsRequest $request
     *
     * @return Response
     */
    public function store(CreateNewsRequest $request)
    {
        $input = $request->all();

        $news = $this->newsRepository->create($input);

        Flash::success('News saved successfully.');

        return redirect(route('news.index'));
    }

1 个答案:

答案 0 :(得分:0)

如果您的存储库扩展InfyOm\Generator\Common\BaseRepository。存储库应该自己更新模型关系。只需使用正确的密钥将关系值与其他输入一起传递。

但是,对于删除和阅读(让我们称之为操作),您需要查询数据。

您可以使用存储库方法,范围查询或条件类来执行此操作。 (并调用这些过滤器)。

  1. 存储库方法:

    // inside your controller
    // some repository filtering method
    $this->repository->whereHas('newsGroup', function($query){...});
    $this->repository->hidden(['field_to_hide']);
    ...
    // some action: delete, all or findWhere...
    $this->repository->delete();
    
  2. 范围查询是回调,它在模型上应用了一些查询并返回它。(与接受并返回Database \ Eloquent \ Builder的Eloquent范围不同)

    $this->repository->scopeQuery(
             function ($model){ return $model->where(...);
    });
    Or your 
    // some action: delete, update or findWhere...
    $this->repository->delete();
    
  3. 标准方式:您将创建一个负责查询的类。对于简单的用例来说,这是一种过度杀伤。

    // inside the controller
    $this->repository->pushCriteria(new NewsBelongingToCategory ($group_id));
    
     // App\Criteria\NewsBelongingToCategory.php
     class NewsBelongingToCategory implements CriteriaInterface {
    
        private $group_id;
    
        public function __construct($group_id){
           $this->group_id = $group_id;
         }
    
        public function apply($model, NewsRepositoryInterface $repository)
           {
                 $group_id = $this->group_id;
                 $model = $model->whereHas('newsCategory',
                       function ($query) use ($group_id){
                           $query->where('group_id', '=', $group_id);
                       });
                  return $model;
            }
     } 
    
    // in your controller
    
    $this->repository->delete();
    

    请注意,某些操作会忽略特定的过滤器。例如,delete(id)update($attributes, $id)不使用条件,另一方面lists($column, $key)不使用范围。