查询关系Laravel Eloquent ORM

时间:2014-11-23 15:21:16

标签: laravel laravel-4 eloquent relationship

我有一个问题很好地理解关系,让我们谈谈

我有3张桌子,有适当的模型

receipt
 - id
 - date

items_sold
 - id
 - receipt_id
 - item_id

items
 - id
 - name

我遇到的问题是收据"有很多"通过items_sold的项目,但我不能使用" hasManyThrough"雄辩地使用了错误的" id" of" items_sold",即使我手动输入了密钥

class Receipt extends Eloquent {

    public function items()
    {
        return $this->hasManyThrough('Items', 'ItemsSold', 'receipt_id', 'id');
    }

}

通过这种方式无法做到这一点,但我可以找到一个有口才的关系方法,可以帮助我解决这个问题

2 个答案:

答案 0 :(得分:1)

我非常确定你真正需要的是多对多关系here

public function items(){
    return $this->belongsToMany('Items', 'items_sold');
}

你的模特真的叫做“物品”吗?如果它实际上是“项目”,则相应地更改为上述代码中的第一个参数

答案 1 :(得分:1)

正如lukasgeiter所说,添加到模型中的belongsToMany()关系将允许您访问相关数据。

要注意的是,如果将连接表的名称更改为item_reciept,则可以在模型中定义多对多关系,而无需专门指定连接表。当Laravel看到没有指定连接表名的belongsToMany方法时,它会查找蛇案例中涉及的两个模型的名称以及具有小写名称的字母顺序。

您的模型方法是:

class Receipt extends Eloquent{

    public function items(){
        return $this->belongsToMany('Item');
    }
}

class Item extends Eloquent{

    public function reciepts(){
        return $this->belongsToMany('Reciept');
    }
}

我可以理解你是否不想重命名你的items_sold表,因为它的特定名称表示它仅用于连接表的用法。

关于将这些关系添加到模型的另一个注意事项是,它允许您根据您的请求执行eager loading,这可能对您的情况有所帮助。

假设您希望一次性获取特定收据的所有项目。您可以使用以下请求将所有内容组合在一起:

$receiptAndItems = Receipt::with('items')->find($recieptId);

这将返回您的特定收据记录和密钥items的详细信息以及该给定收据的所有相关项记录:

// Your `receipt` record
// this is the output when you add `->toArray()` at the end to make it a bit easier to read

array (size=7)
  'id' => int 2
  'name' => string 'Foo' (length=12)
  'created_at' => string '2014-11-22 16:30:02' (length=19)
  'updated_at' => string '2014-11-22 16:30:02' (length=19)
  'items' => 
    array (size=3)
      0 => 
        array (size=7)
          'id' => int 1
          'name' => string 'Bar' (length=13)
          'created_at' => string '2014-11-22 16:30:02' (length=19)
          'updated_at' => string '2014-11-22 16:30:02' (length=19)
          'pivot' => 
            array (size=2)
              ...
      1 => 
        array (size=7)
          'id' => int 2
          'name' => string 'Baz' (length=20)
          'created_at' => string '2014-11-22 16:30:02' (length=19)
          'updated_at' => string '2014-11-22 16:30:02' (length=19)
          'pivot' => 
            array (size=2)
              ...
      2 => 
        array (size=7)
          'id' => int 3
          'name' => string 'FooBarBaz' (length=18)
          'created_at' => string '2014-11-22 16:30:02' (length=19)
          'updated_at' => string '2014-11-22 16:30:02' (length=19)
          'pivot' => 
            array (size=2)