当前位置: 首页 > 知识库问答 >
问题:

当中间模型为空时使用间接关系

祁高格
2023-03-14

在我的几个模型中,我从一个模型到另一个模型建立了间接关系。

这是我的作品模型:

public function GeoEntities()
{
    return $this->hasMany(\App\GeoEntity::class);
}

public function geoLand()
{
    $builder = $this->GeoEntities()->where("entity_type", 0);
    $relation = new HasOne($builder->getQuery(), $this, 'work_id', 'id');
    return $relation;
}

public function geoLandPoints()
{
    return $this->geoLand->geoPoints();
}

返回$this-

但在这种情况下,当geoLand为空时,会产生错误:

在null上调用成员函数geoPoints()

如下图所示:

$points = $work->geoLandPoints;
  • 中间关系是一个有很多

我想用类似的关系调用geoLandPoints而不是geoLandPoints()但是,

当中间日期模型为空时,我需要一个空的关系。

但我不明白,如何做到这一点。

使用Fico7489\Laravel\EloquentJoin\Traits\EloquentJoin包,我尝试重构关系,如下所示:

public function geoLandPoints()
{
    $builder = $this
        ->select("works.*")
        ->join("geo_entities", "works.id", "geo_entities.work_id")
        ->join("geo_points", "geo_entities.id", "geo_points.geo_entity_id")
        ->where("entity_type", 0)
        ->where("works.id", $this->id);
    return new HasMany($builder->getQuery(), $this, "work_id", "id");
}

但是它无法将数据库查询生成器转换为雄辩的查询生成器。

参数1传递给照明\数据库\雄辩\关系\HasOneOr许多::__construct()必须是照明\数据库\雄辩\生成器的实例,给定照明\数据库\查询\生成器的实例


共有1个答案

齐磊
2023-03-14

为什么不使用hasOne()方法,而不是尝试返回自己的hasOne类?此外,您还可以使用withDefault(),这样关系将返回一个空的GeoEntity,而不是null

public function geoLand()
{
    return $this->hasOne(\App\GeoEntity::class)->where("entity_type", 0)->withDefault();
}

您甚至可以传递一个默认值数组<代码>带默认值(['column'=

 类似资料:
  • 我有3个模型:用户、宠物和诊所。 让我们假设表格:用户、宠物和诊所。关系是,一个用户可以有多个宠物,而一个宠物只有一个诊所。 在“Pets”表中,我有一个FK到用户id,另一个FK到诊所id。 我想做一些类似的事情: 在用户模型上,返回与用户关联的所有不同诊所。现在我只能做: 但我只想返回不同的诊所。 用户模态: 宠物模式: 有什么建议吗?

  • 我有一个多对多关系的轴心模型,叫做UserWebpage。 我也有个模特叫收藏 我试图在用户网页和收藏之间建立多对多的关系。基于我发现的这个SO问题,我知道这样的事情应该是可能的: Laravel:如何使用多个数据透视表关系 我的问题是: 当我尝试在UserWebpage实例和集合实例之间插入关系时,会出现以下错误。 插入关系的代码: 我得到的错误是: Illumb\Database\QueryE

  • 问题内容: 我正在开发一个支持Google两步验证的应用程序。此应用程序还支持“可信任此设备30天”的功能。 我使用数据库保存所有这些信息,例如IP地址和到期时间。现在,当我填写时间戳以将当前时间增加30天时,它将比当前时间早的时间戳插入数据库中。 例如:当前时间= 。现在,当我加上30天(毫秒)时,得出的日期不是30天,而是大约19天。 问题答案: 此问题与32位整数溢出有关。由于整数的最大值为

  • 模型(Model)之间存在各种各样的关系,如:一对一(One-To-One )、一对多(One-To-Many)等。模型间的关系本质上是对其代表的数据库中表之间的关系描述,通过这些关系可以实现数据库中表之间主/外键约束的创建。查询时也可以基于这些关系,生成在数据库中执行的连接查询或复合查询SQL语句。 关系/关联的使用 1.1 一对一(One-To-One)关联 1.2 一对多(One-To-Ma

  • 问题内容: 我有一个打算用数据库记录填充的结构,datetime列之一为可为空: 由于指针可以是,所以我做了一个指针,但这需要代码知道变量之间的区别。有没有更优雅的方式来解决这个问题? 问题答案: 您可以使用,或者在Go 1.13中,现在可以使用标准库的类型。 从github上的lib / pq :

  • 问题内容: 我目前正在尝试Django。我在urls.py中的一个参数中使用了参数。当我运行服务器并尝试浏览时,出现此错误。 这些是我的urls.py文件: 和 我如何通过错误消息中所述的? 问题答案: 检查文档是否包含在此处。 您所做的不是传递参数包括的可接受方法。您可以这样做: