【问题标题】:How can I solve "Relation 'a' is not instance of HasOne or BelongsTo." in the laravel?如何解决“关系‘a’不是 HasOne 或 BelongsTo 的实例。”在 laravel 里?
【发布时间】:2018-08-01 19:45:54
【问题描述】:

我的 laravel 雄辩是这样的:

$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;

如果执行了查询,就会出现这样的错误:

Relation 'a' is not instance of HasOne or BelongsTo.

我该如何解决这个问题?

更新

我的物品模型是这样的:

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

我的物品细节模型是这样的:

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

【问题讨论】:

  • 你需要更清楚。返回 $query 后发生了什么?你必须运行什么代码?
  • @MohamedSabil83 不,存在这样的错误
  • 您的型号代码是多少?你的控制器代码是什么?让我们为您提供帮助。
  • @MohamedSabil83 我更新了我的问题
  • 首先,您需要交换两个关系中的iditem_number,而item_number外键

标签: laravel join eloquent laravel-5.6


【解决方案1】:

根据你的一些细节,请确认这是不是你想要的:

物品型号:

class Item extends Model
{
  ...
  protected $fillable = [
    'name',
    'vendor_id'
  ];

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

ItemDetail 模型:

class ItemDetail extends Model
{
  ....
  protected $fillable = [
    'item_number',
    'name',
    'posting_date'
  ];

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

控制器方法:

$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);

查看文件:

@foreach($itemDetails as $itemDetail)
    @dump($itemDetail->item_number)
    @dump($itemDetail->total_quantity)
@endforeach

【讨论】:

    【解决方案2】:

    访问您想要的主模型并在其中包含您需要包含的关系会更有意义。

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

    $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;
    

    如果这样做,您可以访问分页数据:

    foreach ($itemsPage as $item) {
        // $item is an instance of Item
        // $item->item_details->total_quantity should have the sum of the item details
    } 
    

    【讨论】:

      【解决方案3】:

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

      public function a()
      {
          return $this->belongsTo(RelatedModel::class);
      }
      

      【讨论】:

      • 我不能,因为我需要你的模型。
      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 2023-03-08
      • 2020-05-16
      • 1970-01-01
      • 2018-05-29
      • 2023-02-16
      • 1970-01-01
      • 2018-09-25
      相关资源
      最近更新 更多