【问题标题】:cannot replicate model with unique slug field无法复制具有唯一 slug 字段的模型
【发布时间】:2020-04-25 14:16:06
【问题描述】:

我无法理解如何复制具有唯一 slug 字段的模型。 我看到成功消息,但此代码不会在数据库表中创建额外的行。 并且调试栏中没有消息或异常。


    public function handle(Model $model)
    {
        $model->replicate(['slug']);
        $model->slug = Str::slug($model->title, '-') . $model->id;
        $model->save();
        return $this->response()->success('Скопировано!')->refresh();
    }

如果我在中间的某处添加dd($model),它对我没有帮助,因为除了糟糕消息之外我什么都看不到。 这是迁移文件

        Schema::create('news_posts', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->integer('category_id')->unsigned();
            $table->string('title', 255)->nullable();
            $table->string('slug', 255)->unique();
            $table->text('fulltext')->nullable();
            $table->string('image', 255)->nullable();
            $table->boolean('is_published')->default(false);
            $table->timestamp('published_at')->nullable();
            $table->timestamps();
            $table->softDeletes();

            $table->foreign('category_id')->references('id')->on('news_categories');
            $table->index('is_published');
        });

【问题讨论】:

  • 得看看 devtools 上的网络标签
  • 在 chrome devtools 中找不到任何有用的东西。 models: {data: {App\Models\NewsPost: 1, Encore\Admin\Auth\Database\Administrator: 1}, count: 2} count: 2 data: {App\Models\NewsPost: 1, Encore\Admin\Auth\Database\Administrator: 1} App\Models\NewsPost: 1 Encore\Admin\Auth\Database\Administrator: 1

标签: laravel replicate laravel-admin


【解决方案1】:

Model::replicate 返回您正在创建的新实例(复制旧实例)。你对这个新模型没有做任何事情;您尚未将其分配给变量。您正在更新 现有 模型实例 ($model) 的 slug 字段并尝试保存现有模型实例,而不是新模型实例。

此外,新模型实例在保存之前不会有 id,而不是之前。

如果这是您在任何地方生成 slug 的方式,那么您无需在现有模型上更新任何内容,并且 slug 字段不会被视为脏字段,因为它与您设置它之前的状态相同;所以实际上没有保存(因为没有什么要更新的)。

【讨论】:

  • 如果你提到的都是真的,那么你如何解释如果我在表中没有唯一字段那么简​​单的$model->replicate()->save(); 会给我数据库表中的新行?
  • 因为$model->replicate() 返回一个新模型实例,然后您在该新模型实例上调用save(保存新记录,因为它是一个不存在的模型)......虽然不确定是什么它正在为 slug 字段保存...我可能会将该字段为空,因此我可以在创建 slug 后设置它
  • slug 不能为空并且应该是唯一的,因为它是 URI 的一部分
  • 如果在保存新模型实例之前id 不存在,那么我希望我们可以为 slug 使用不同的文本。例如$model->replicate(['slug']); $model->slug = Str::slug($model->title, '-') . '-copy'; $model->save(); 但它也不起作用
  • 因为$model 是旧模型实例而不是新复制模型...再次
【解决方案2】:

这是有效的。

        $new = $model->replicate();
        $new->slug = $new->slug . time();
        $new->save();

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 2017-07-14
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多