Laravel 从 ID 中获取模型,使用 owntoMany

Oğu*_*çek 6 php mysql relationship laravel

我正在使用 Laravel 4 构建应用程序,但数据透视表存在一些问题。

有 3 个表 Categories , Products , products_categories (pivot)

品类模型

public function product()
{
    return $this->belongsToMany('Product', 'products_categories');

}
Run Code Online (Sandbox Code Playgroud)

产品型号

public function category()
{
    return $this->belongsToMany('Category', 'products_categories');
}
Run Code Online (Sandbox Code Playgroud)

products_categories表有product_idcategory_id列。

我想要的是获取此类别中的所有产品并在视图中列出它们

$category = Category::where('id' , '=' , '7')->first();

    foreach($category->product as $product){

        echo $product->id;
    }
Run Code Online (Sandbox Code Playgroud)

我可以看到与特定类别相关的产品 ID,但是当我想使用它来获取所有产品本身时,例如:

    $category = Category::where('id' , '=' , '7')->first();

    foreach($category->product as $product){

        $product = Product::where('id' , '=' , $product->id )->get();
    }

    return View::make('index')->with('product',$product);
Run Code Online (Sandbox Code Playgroud)

它不起作用:(出现此错误

试图获取非对象的属性

我试过这个

$category = Category::where('id' , '=' , '7')->first();

    $product = array();

    foreach($category->product as $product){

        $product[] = Product::where('id' , '=' , $product->id )->get();

    }

    return View::make('index')->with('product',$product);
Run Code Online (Sandbox Code Playgroud)

这次它抛出这个错误

Illuminate\Database\Eloquent\Model::setAttribute() 缺少参数 2

我该如何解决这个问题?

pat*_*cus 6

当前的问题是您正试图从 foreach 循环中重用迭代器变量。这会导致您意想不到的结果。

foreach($category->product as $product) {
                              ^^^^^^^^
    $product = Product::where('id' , '=' , $product->id )->get();
    ^^^^^^^^
}
Run Code Online (Sandbox Code Playgroud)

但是,没有必要执行任何操作。$category->product已经是 Eloquent 产品模型的集合。无需再次尝试检索单个产品;你已经拥有了。

如果您尝试将此 Collection 传递给视图,则可以执行以下操作:

return View::make('index')->with('product', $category->product);
Run Code Online (Sandbox Code Playgroud)

另外,作为旁注,如果您尝试通过 id 查找记录,则可以使用以下find()方法:

$category = Category::find(7);
Run Code Online (Sandbox Code Playgroud)