gpt4 book ai didi

namespaces - Laravel - Eloquent : Polymorphic relations with namespace

转载 作者:行者123 更新时间:2023-12-04 16:52:48 29 4
gpt4 key购买 nike

我的情况是:日历属于客户或销售员

因为我还有像 Event 和 File 这样的类,所以我将命名空间 App\Models 用于我所有的模型类。

所以我设置了多态关系:

在日历.php

public function user() {
return $this->morphTo();
}

在 Customer.php 和 Salesman.php 中
public function calendars() {
return $this->morphMany('App\Models\Calendar', 'user');
}

现在当我做
$calendar= Calendar::find(1); //calendar from a salesman
$calendar->user; //error here
...

我收到此错误消息:
Symfony \ Component \ Debug \ Exception \ FatalErrorException
Class 'salesman' not found

我注意到 'salesman'是小写的,也许这就是问题所在?

这是我从 Laravel 堆栈跟踪中得到的

打开:/var/www/cloudcube/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
// foreign key name by using the name of the relationship function, which
// when combined with an "_id" should conventionally match the columns.
if (is_null($foreignKey))
{
$foreignKey = snake_case($relation).'_id';
}

$instance = new $related; //HIGHLIGHTED

我之前在这一行上遇到过类似的错误,当时我弄乱了命名空间,所以我想这与此有关。有什么办法可以告诉 morphTo()使用正确命名空间的方法?

或者是其他原因导致了这个问题?

也找到了这个解决方案,但似乎无法让它工作:
Polymorphic Eloquent relationships with namespaces

最佳答案

我找到了一个对我有用的解决方案。

我总是用正确的命名空间定义关系,例如在日历中:
public function events() {
return $this->hasMany('App\Models\Event');
}

我的问题包括两个并发症:

  • $calendar->user()morphTo(...)函数不起作用,因为我的模型在命名空间中,并且 morphTo(...)没有办法给这个命名空间。
  • $salesman->calenders()->get()返回和空列表,虽然我在数据库中的关系在那里。我发现这是因为与查询绑定(bind)。

  • 1. 的解决方案:编写自定义 morphTo(...) Calendar 中的函数来覆盖 Laravel 中的一个。我用的是Laravel的源码 morphTo(...)作为基地。这个函数最后的语句是 return $this->belongsTo($class, $id);那里 $class必须是命名空间的类名。我使用基本的字符串操作来实现它。

    2. 的解决方案:编写自定义 morphMany(...) Salesman 中的函数并让它返回 MyMorphMany(...)类似于 Polymorphic Eloquent relationships with namespaces描述。

    这里的问题是 $query传递给 MyMorphMany构造函数具有错误的(命名空间)绑定(bind)。它将寻找 where user_type = "App\\Models\\Salesman" .

    为了解决这个问题,我使用了自定义 getResults()函数在 MyMorphMany它覆盖了默认的 Laravel 实现,在那里我更改了绑定(bind)以使用正确的、未命名空间的小写类名。然后我调用这个 getResults() get() 中的函数 MyMorphMany的功能类(class)。

    我用过 $query->getBindings()$query->setBindings()纠正绑定(bind)。

    希望这可以为其他人节省几天的工作时间,就像它可以拯救我一样 :)

    关于namespaces - Laravel - Eloquent : Polymorphic relations with namespace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812187/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com