从hasMany关系和paginate获取所有对象

Sid*_*Sid 12 php pagination relationship laravel-5

在我的Laravel应用程序中,我有一个类别列表页面.当用户点击某个子类别时,我想列出所有产品并对该结果使用分页.我现在已经在子类别ID的帮助下列出了与该子类别相关的所有产品:

public function subcategoryListing($slug){
    $products = Subcategory::find($idofSubcat)->products;
    return view('pages.subcategorylisting')
        ->with(array(
            'products' => $products,
        ));
}
Run Code Online (Sandbox Code Playgroud)

此结构涉及三个类:Category,SubcategoryProducts.他们被宣布如下:

类别

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\Relation;
use App\Subcategory;

class Category extends Model
{
    protected $table = 'category';

    public $timestamps = false;

    public function subCategory(){
        return $this->hasMany('App\Subcategory', 'category_id');
    }
}
Run Code Online (Sandbox Code Playgroud)

子目录

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Subcategory extends Model
{
    protected $table = 'subcategory';

    public $timestamps = false;

    public function products(){
        return $this->hasMany('App\Products');
    }
}
Run Code Online (Sandbox Code Playgroud)

制品

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Products extends Model
{
    protected $table = 'products';
}
Run Code Online (Sandbox Code Playgroud)

对于每个模型类,我有一个表,具有以下结构:

Category
- id
- category_name

SubCategory
- id
- category_id
- subcategory_name

Products
- id
- subcategory_id
- product_title
- description
- price
Run Code Online (Sandbox Code Playgroud)

我想要的是在我的页面中对从查询中检索到的结果进行分页.有没有更好的方法来获取products关联subcategory并分页它们?

Gus*_*ube 6

在Eloquent(Laravel的ORM)中,当您将关系称为property($subCategory->products)时,它会根据关系类型(属于,有很多,......)返回相关对象或对象集合.相反,如果将其称为函数($subCategory->products()),则会获得一个QueryBuilder实例.

请参阅http://laravel.com/docs/5.1/eloquent-relationships#querying-relations,在关系方法Vs一节中.动态属性以获取更多详细信息.

无论如何,使用关系方法,您可以调用paginate()您的收藏.然后,考虑到这一点,您可以稍微更改您的代码以获得您想要的:

public function subcategoryListing($slug) {

    // I'm supposing here that in somewhere before 
    // run the query, you set the value to $idofSubcat 
    // variable

    $products = Subcategory::find($idofSubcat)->products()->paginate();
    return view('pages.subcategorylisting')
        ->with(array(
            'products' => $products,
        ));
}
Run Code Online (Sandbox Code Playgroud)


Scr*_*bot 2

我认为,创建两个类别表不太正确,最好使用下一步:

表类别

id    category_name   parent_id(nullable)  
Run Code Online (Sandbox Code Playgroud)

和产品

 id          category_id        product_title      description     price
Run Code Online (Sandbox Code Playgroud)

它更有用,您可以删除一个子类别模型并在类别中执行所有操作。

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $table = 'category';

    public $timestamps = false;

    public function subCategory(){

        return $this->belongsToMany('App\Category', 'categories', 'id', 'parent_id');
    }

    public function products(){
        return $this->hasMany('App\Products');
    }
}
Run Code Online (Sandbox Code Playgroud)

及产品型号

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Products extends Model
{
    protected $table = 'products';

    public function category() {
         return $this->belongsTo('App\Category')
    }


}
Run Code Online (Sandbox Code Playgroud)

然后就可以得到查询结果

public function subcategoryListing($slug){
        $products = Category::find($idofSubcat)->products;
        return view('pages.subcategorylisting')
            ->withProducts($products); // it's a magic)) 
}
Run Code Online (Sandbox Code Playgroud)

但是,现有的一件事情并不美好。您真的确定该产品只会属于一个类别吗?)