繁体   English   中英

如何从关系 belongsToMany 中只获取一个注释?

[英]How to get only one note from relation belongsToMany?

我只有一个与 belongsToMany 有关系的表,但这是开发人员的错误,所以我无法更改此结构,所以我只需要获取 first()。 但是,当我只首先返回空数组时,但我需要 object

    $animals = Cat::query()->with(['types' => function($query) {
       $query->first(); //wrong
    }])

那么我怎么才能得到第一呢? 因为我需要按这个字段排序,但我不能,因为它是数组

你可以通过两种方式做到这一点:

1- 使用 hasOne 关系:

class Cat {
   public function firstType() {
      
       return $this->hasOne(Type::class, 'type_id', 'id')->latest(); 
}
}

2-使用 staudenmeir/eloquent-eager-limit

安装后你可以这样写:

class Cat extends Model
{
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
 public function firstType() {
      
       return $this->hasMany(Type::class, 'type_id', 'id')->latest()->limit(1); 
}
}

  class Type extends Model
    {
        use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
        //  ...... 
    }

HasEagerLimit特性的优点是您不仅可以将结果限制为一个,还可以将结果限制为任何您想要的数字......

现在你可以写:

 $animals = Cat::query()->with('firstType');

您可以添加属性 getter 并设置为附加属性。 按照下面的例子:

class Cat {
   protected $appends = ['type'];

   public function getTypeAttribute() {
       // return the first element from your array of the belongsToMany relationship if it exists
       return  isset($this->types[0])? $this->types[0] : null; 
   }

}

重要的是要记住此方法只会带来一种类型。 如果你想每次都获得相同的类型,你可以创建一个不同的表,其中 cat 表有 type_id 列。

obs:对不起我的英语,它仍在工作中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM