【问题标题】:Create new Post with default Category belongsToMany使用默认类别 belongsToMany 创建新帖子
【发布时间】:2019-07-04 13:57:42
【问题描述】:

我有一个 Post/Category manyToMany 关系,并希望能够将名为“Uncategorised”的默认类别附加到每个创建的新帖子。我怎样才能做到这一点? BelongsToMany 方法仅适用于详细信息页面,不适用于创建页面。

BelongsToMany::make(__('Categories'), 'categories', Category::class),

【问题讨论】:

  • "BelongsToMany 方法仅适用于详细信息页面,不适用于创建页面。"这是什么意思,这种关系将永远有效?
  • @MartinHenriksen 是的,这是正确的。我不确定你在问我什么?

标签: laravel laravel-nova


【解决方案1】:

您还可以为您的数据库字段设置默认值,这样您就可以省略传递类别,并将默认设置为 未分类,就像您使用 MySQL 时一样,您可以通过创建迁移来做到这一点

$table->text('category')->default(0);

【讨论】:

  • 这也是一个不错的方法
【解决方案2】:

因为在 Post Nova 模型中创建模式时不显示 BelongsToMany。因此,我们必须通过将此代码添加到您的字段来进行自定义选择:

public function fields(Request $request)
{
    if($request->editMode=="create"){
        $categories = \App\Category::get(['id','name']);
        $options = [];
        foreach($categories as $value){
            $options[$value->id] = $value->name;
        }
        return [
            ID::make()->sortable(),
            Text::make('Title'),
            Text::make('Summary'),
            Textarea::make('Content'),
            Select::make('Categories', 'category_id')
            ->options($options)
            ->displayUsingLabels()
            ->withMeta(['value' => 1]) // 1 = id of Uncategorised in categories table
        ];
    }
    return [
        ID::make()->sortable(),
        Text::make('Title'),
        Text::make('Summary'),
        Textarea::make('Content'),
        BelongsToMany::make('Categories','categories')->display('name'),
    ];
}

不要忘记 Post 和 Category 模型中的关系函数:

class Post extends Model
{
    public function categories(){
        return $this->belongsToMany(Category::class, 'category_post', 'post_id', 'category_id');
    }
}

还有:

class Category extends Model
{
    public function posts(){
        return $this->belongsToMany(Post::class,'category_post', 'category_id', 'post_id');
    }
}

然后,自定义函数处理Post资源页面模式Create的数据,在nova\src\Http\Controllers\ResourceStoreController.php,把函数句柄改成这个:

    public function handle(CreateResourceRequest $request)
    {
        $resource = $request->resource();

        $resource::authorizeToCreate($request);

        $resource::validateForCreation($request);

        $model = DB::transaction(function () use ($request, $resource) {
            [$model, $callbacks] = $resource::fill(
                $request, $resource::newModel()
            );

            if ($request->viaRelationship()) {
                $request->findParentModelOrFail()
                        ->{$request->viaRelationship}()
                        ->save($model);
            } else {
                $model->save();
                // your code to save to pivot category_post here
                if(isset($request->category_id)&&($resource=='App\Nova\Post')){
                    $category_id = $request->category_id;
                    $post_id = $model->id;
                    \App\Post::find($post_id)->categories()->attach($category_id);
                }
            }

            ActionEvent::forResourceCreate($request->user(), $model)->save();

            collect($callbacks)->each->__invoke();

            return $model;
        });

        return response()->json([
            'id' => $model->getKey(),
            'resource' => $model->attributesToArray(),
            'redirect' => $resource::redirectAfterCreate($request, $request->newResourceWith($model)),
        ], 201);
    }
}

在我的电脑上运行良好。一个有趣的问题和我一起!希望对你最好,如果你需要,问我!

【讨论】:

  • 感谢@protoproto,我还没有测试过你的解决方案,但感谢您的帮助。
  • 是的,想得远,做得最好! : D
【解决方案3】:

我最终做的是在 boot() 中保存 Post Model 上的数据。

public static function boot()
{
    parent::boot();

    static::created(function (Post $post) {

        $post->categories()->attach([1]);

    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多