首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我如何解决“关系'a‘不是HasOne或BelongsTo的实例。”在小腹里?

我如何解决“关系'a‘不是HasOne或BelongsTo的实例。”在小腹里?
EN

Stack Overflow用户
提问于 2018-08-02 03:45:55
回答 3查看 650关注 0票数 0

我的幼体是这样雄辩的:

代码语言:javascript
复制
$query = ItemDetail::selectRaw('a.item_number, sum(abs(a.quantity)) as "total_quantity"')
              ->from('item_detail as a')
              ->join('items as b', 'b.id', '=', 'a.item_number');

if(isset($param['vendor'])) {
    $query = $query->where('b.vendor_id', '=', $param['vendor']);
}

$query = $query->groupBy('a.item_number')
               ->paginate($paged);

return $query;

如果执行查询,则会出现如下错误:

代码语言:javascript
复制
Relation 'a' is not instance of HasOne or BelongsTo.

我该如何解决这个问题?

更新

我的商品模型如下:

代码语言:javascript
复制
class Item extends Model
{
    ...
    protected $fillable = [
        'name',
        'vendor_id'
    ];
    public function item_details() 
    {
        return $this->hasMany(ItemDetail::class, 'id', 'item_number');
    }
}

我的商品详细模型如下:

代码语言:javascript
复制
class ItemDetail extends Model
{
    ....
    protected $fillable = [
        'item_number',
        'name',
        'posting_date'
    ];
    public function item()
    {
        return $this->belongsTo(Item::class, 'id', 'item_number');
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-02 12:41:48

根据您的几个详细信息,请确认这是否是您想要的:

项目模型:

代码语言:javascript
复制
class Item extends Model
{
  ...
  protected $fillable = [
    'name',
    'vendor_id'
  ];

  public function item_details() 
  {
      return $this->hasMany(ItemDetail::class, 'item_number', 'id');
  }
}

ItemDetail模型:

代码语言:javascript
复制
class ItemDetail extends Model
{
  ....
  protected $fillable = [
    'item_number',
    'name',
    'posting_date'
  ];

  public function item()
  {
    return $this->belongsTo(Item::class, 'item_number', 'id');
  }
}

控制器方法:

代码语言:javascript
复制
$itemDetails = ItemDetail::whereHas('item', function($q) use ($param) {
    if (isset($param['vendor']){
        $q->where('vendor_id', '=', $param['vendor']);
    }
})
->selectRaw('item.id', 'item_detail.item_number', 'sum(abs(a.quantity)) as total_quantity')
->groupBy('item_number')->paginate($paged);

查看文件:

代码语言:javascript
复制
@foreach($itemDetails as $itemDetail)
    @dump($itemDetail->item_number)
    @dump($itemDetail->total_quantity)
@endforeach
票数 1
EN

Stack Overflow用户

发布于 2018-08-02 15:12:53

访问您想要的主模型并将其包含在其中,以及您需要包含的关系,这更有意义。

这里有一个潜在的不同的解决方案:

代码语言:javascript
复制
$query = Item::with(['item_details' => function ($query) {
    $query->groupBy('item_number')->selectRaw("item_number, sum(abs(a.quantity)) as 'total_quantity'");
}]);
if (isset($param['vendor'])) {
    $query->where('vendor_id', $param['vendor']);
}
$itemsPage = $query->paginate($paged);
return $pages;

如果执行以下操作,则可以访问分页数据:

代码语言:javascript
复制
foreach ($itemsPage as $item) {
    // $item is an instance of Item
    // $item->item_details->total_quantity should have the sum of the item details
} 
票数 1
EN

Stack Overflow用户

发布于 2018-08-02 03:50:42

由于信息太少,我只能猜测:您的模型缺少以下内容:

代码语言:javascript
复制
public function a()
{
    return $this->belongsTo(RelatedModel::class);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51641204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档