【问题标题】:How can I merge two hasMany relations from the same table?如何合并同一张表中的两个 hasMany 关系?
【发布时间】:2015-11-22 22:19:29
【问题描述】:

我想在一个模型方法中合并两个 hasMany 关系。这两个关系几乎相同,唯一的区别是外键。

请注意,我不能简单地在两个关系上调用查询构建器 get() 方法,因为我必须使用合并的关系,而不是集合,例如我想稍后对合并的关系进行排序,或者调用->where()

这是一个示例代码:

Friend.php

<?php
class Friend extends Model
{
  /*
  Database structure:
  - id
  - user_id
  - friend_id
  */

  public function user()
  {
    return $this->belongsTo('App\Models\User');
  }
  public function friend()
  {
    return $this->belongsTo('App\Models\User', 'friend_id');
  }
}

User.php

<?php
class User extends Model
{
  /*
  Database structure:
  - id
  [...]
  */

  public function friends()
  {
    $friends_left = $this->hasMany('App\Models\Friend', 'friend_id');
    $friends_right = $this->hasMany('App\Models\Friend', 'user_id');
    // return single relation
  }
}

【问题讨论】:

  • 根据定义,一个模型/表只有一个标识符,看起来 Friend 模型应该有两个标识符......这可能吗?
  • @Amarnasan 是的,我也发现了这个问题,但这并没有解决我的问题,因为它将两个集合合并为一个集合,这意味着我不能再对其调用查询方法。跨度>
  • 但是你打算执行什么样的“查询方法”呢?能给我举个例子吗?因为我认为您不能在任何“hasMany”之后执行“get”。我的意思是,你不能这样做:$this->user()->get(),即使“user()”是标准的“hasMany”关系,因为它不会返回“query”对象,而是给定模型的对象集合。
  • 我目前得到的是Illuminate\Database\Query\Builder 类型的对象(例如变量$friends_left 来自该类型)

标签: php laravel eloquent laravel-5.1


【解决方案1】:

我知道这很糟糕,但是...考虑将您的合并集合转换为这样的新查询:

    $collection1 = ...;
    $collection2 = ...;
    $collection = $collection1->merge($collection2);
    $values = $collection->lists('id');
    $query = User::whereIn('id',$values)->....and continue with your queries;

【讨论】:

  • 好吧,除了这个解决方案会导致另一个数据库查询之外,由于主键查找,性能损失不会太高。至少这是一个省力的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2014-04-12
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多