Laravel:获取数据透视表关联

时间:2020-03-06 13:12:42

标签: php laravel eloquent

我有几个表:

Quote
    id_quote (PK)

ItemQuote
    id_item_quote (PK)
    quote_id (FK)
    item_id (FK)

Item
    item_id (PK)

在每个 ItemQuote 上,可以有多个 Service

ItemQuoteService
    id_item_quote_service (PK)
    item_quote_id (FK)
    service_id (FK)

Service
    id_service (PK)

架构: enter image description here

我使用两个自定义枢轴实体,因为关系中还有其他字段:

class Quote extends Model {
    // ...
    public function items() {
        return $this->belongsToMany(Item::class, 'ItemQuote', 'quote_id')
            ->using(ItemQuote::class);
    }
}

class ItemQuote extends Model {
    // ...
    public function services() {
        return $this->belongsToMany(Service::class, 'ItemQuoteService', 'id_item_quote')
            ->using(ItemQuoteService::class);
    }
}

当我得到报价时,我可以轻松地将 ItemQuote

$quote = Quote::with([
      'items',
    ])->findOrFail($id);

$quote->items->pivot // contains the attributes of ItemQuote

我还想访问 ItemQuoteService 的属性。但是我不知道该如何传递给with函数以使其正常工作。

$quote = Quote::with([
      'items.pivot.service', // NOT WORKING
    ])->findOrFail($id);

如何获取Quote->ItemQuote->ItemQuoteService属性(从获取一个 Quot 报价)?

1 个答案:

答案 0 :(得分:1)

您也许可以使用其他关系来检索它们:

require 'fileutils'
class FileOwner
  attr_accessor :name
  attr_accessor :permissions

  def initialize(name, permissions, path_to_files)
    @name = name
    @permissions = permissions.push(name)
    @personal_folder = path_to_files + name
    ensure_personal_folder_exists()
  end

  public
  def copy_file_if_allowed(file_path, file_identifier)
    if @permissions.include? file_identifier
      add_file_to_personal_folder(file_path)
    end
  end

  private
  def ensure_personal_folder_exists()
    FileUtils.mkdir_p(@personal_folder)
  end

  def add_file_to_personal_folder(file_path)
    FileUtils.cp(file_path, @personal_folder)
  end
end

然后使用// Class Quote public function ItemQuoteServices() { return $this-hasManyThrough(ItemQuoteService::class, ItemQuote::class, 'quote_id', 'item_quote_id'); } 对其进行调用。

您必须仔细检查那些第3和第4个参数,如果不使用它们,它可能会起作用。

您还可以在$quote->with(['itemQuoteServices']);类上创建一个ItemQuoteServices()(几乎相同的代码),但是随后您必须使用Item来调用它,这会检索更多的数据。 / p>