【问题标题】:Model property connection (validate request) - Laravel模型属性连接(验证请求)- Laravel
【发布时间】:2022-12-16 23:14:42
【问题描述】:

我发现控制器中存在验证问题。

如果您在模型中指定连接,并在控制器中创建验证,则问题看起来像这样。在验证中,指定唯一列,然后模型默认连接。 我的代码 sn-ps。

模型:

protected $connection = 'api';
protected $table = 'pages';

protected $fillable = [
    'name', 'title', 'description',
    'keywords', 'slug', 'content', 'status',
    'sort', 'type'
];

public function sluggable(): array
{
    return [
        'slug' => [
            'source' => 'title'
        ]
    ];
}

控制器(资源):

public function store(PagesRequest $request)
{
  Pages::create($request->all());
  return view('pages.pages.index', [
     'pages' => Pages::orderBy('id', 'desc')->paginate(30)
  ])->with(['success' => true]);
}

页面请求:

    public function rules()
    {
        return [
            'name' => 'required|string|min:5|max:255|unique:pages,name,'.@$this->page->id,
            'title' => 'required|string|min:5|max:255|unique:pages,title,'.@$this->page->id,
            'description' => 'required|string|min:5|max:255',
            'keywords' => 'required|string|min:5|max:255',
            'slug' => 'unique:pages,slug,'.@$this->page->id
        ];
    }

据我了解,在 rules 方法中有一个对“unique:pages”数据库的请求,这里模型已经不是通过连接而是通过默认连接工作。

如果我删除“唯一”检查,那么一切正常。页面请求:

    public function rules()
    {
        return [
            //'name' => 'required|string|min:5|max:255|unique:pages,name,'.@$this->page->id,
            //'title' => 'required|string|min:5|max:255|unique:pages,title,'.@$this->page->id,
            'description' => 'required|string|min:5|max:255',
            'keywords' => 'required|string|min:5|max:255',
            //'slug' => 'unique:pages,slug,'.@$this->page->id
        ];
    }

这种情况有什么解决办法吗?

_

【问题讨论】:

    标签: laravel validation model connection


    【解决方案1】:

    如果您不确定,可以在the offical repository 上创建问题。

    我从来没有遇到过这个问题,因为我没有遇到过这个问题,但让我告诉你如何检查你是否正确,然后你可以做些什么来解决它。

    首先,转到源代码,因为您没有指定您使用的是哪个版本,步骤是相同的​​,但您必须在该版本上进行检查。

    所以,validateUnique 是你正在使用的规则,正如你所看到的规则非常简单,[parseTable][parseTable] 是负责解析你想要的表和连接的规则。

    public function parseTable($table)
    {
        [$connection, $table] = str_contains($table, '.') ? explode('.', $table, 2) : [null, $table];
    
        if (str_contains($table, '\') && class_exists($table) && is_a($table, Model::class, true)) {
            $model = new $table;
    
            $table = $model->getTable();
            $connection ??= $model->getConnectionName();
    
            if (str_contains($table, '.') && Str::startsWith($table, $connection)) {
                $connection = null;
            }
    
            $idColumn = $model->getKeyName();
        }
    
        return [$connection, $table, $idColumn ?? null];
    }
    

    我将复制粘贴该方法的作用,以便我们可以快速了解连接是如何获得的:

    1. 第一种方式:它通过句点/点 (.) 拆分表的字符串,它将存储连接名称(作为字符串)或将 null 存储在 $connection 上。
    2. 第二种方法取决于您传递的表名是否可识别为文字模型类(如果您有一个名为Item 的模型并且该表是products,这部分将不起作用,因此在这种情况下您将有一个不同的“预期”行为,也许这是你的问题):如果它能够使用... && is_a($table, Model::class, true)解析表,它将执行$connection ??= $model->getConnectionName();并使用该连接。使用??= 正好意味着$connection = $connection ?? $model->getConnectionName();(这意味着如果$connection 不是null,它将使用该值,否则执行getConnectionName()

      有关??= 的更多信息。

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2017-11-21
      • 2020-01-13
      • 2016-08-30
      • 1970-01-01
      • 2017-10-01
      • 2019-12-31
      • 2020-11-06
      • 2020-08-20
      相关资源
      最近更新 更多