Laravel 创建默认类别为“”的新帖子
我有一个职位/类别很多关系,希望能够附加一个名为“未分类”的默认类别到每个新创建的职位。我该怎么做?BelongToMany方法仅在“详细信息”页面上有效,而不在“创建”页面上有效Laravel 创建默认类别为“”的新帖子,laravel,laravel-nova,Laravel,Laravel Nova,我有一个职位/类别很多关系,希望能够附加一个名为“未分类”的默认类别到每个新创建的职位。我该怎么做?BelongToMany方法仅在“详细信息”页面上有效,而不在“创建”页面上有效 BelongsToMany::make(__('Categories'), 'categories', Category::class), 您还可以将默认值设置为数据库字段,这样您就可以忽略传递类别,并将默认值设置为未分类,就像您使用MySQL一样,您可以通过创建迁移来实现这一点 $table->text('
BelongsToMany::make(__('Categories'), 'categories', Category::class),
您还可以将默认值设置为数据库字段,这样您就可以忽略传递类别,并将默认值设置为未分类,就像您使用MySQL一样,您可以通过创建迁移来实现这一点
$table->text('category')->default(0);
因为在后新星模型中创建的“BelongTomany未在模式上显示”。因此,我们必须通过将以下代码添加到您的字段来进行自定义选择:
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');
}
}
以及:
然后,自定义函数在Post资源页面的创建模式下处理数据,位于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);
}
}
我的电脑运行良好。一个有趣的问题!希望你一切顺利,如果你需要的话请告诉我 我最后做的是将Post模型上的数据保存在boot()中
“BelongToMany方法只在“详细信息”页面有效,而不在“创建”页面有效。“你这么说是什么意思,这种关系将始终有效?@MartinHenriksen是的,这是正确的。我不知道你在问我什么?这也是一种很好的方法Hanks@protoproto,我还没有测试过你的解决方案,但是谢谢你的帮助。是的,想得大点,做得最好!:D
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);
}
}
public static function boot()
{
parent::boot();
static::created(function (Post $post) {
$post->categories()->attach([1]);
});
}