【问题标题】:Getting all objects from hasMany relation and paginate从 hasMany 关系中获取所有对象并分页
【发布时间】:2015-12-06 05:08:54
【问题描述】:

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

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

此结构涉及三个类:CategorySubcategoryProducts。声明如下:

类别

<?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');
    }
}

子类别

<?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');
    }
}

产品

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

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

Category
- id
- category_name

SubCategory
- id
- category_id
- subcategory_name

Products
- id
- subcategory_id
- product_title
- description
- price

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

【问题讨论】:

  • 嘿@Sid,你的$slug 变量的内容是什么?此外,您在调用 find 方法时使用的 $idofSubcat 变量似乎没有被初始化。
  • 嘿!我下面的回答对你有帮助吗?如果是这样,请接受它作为正确的。这样做可以帮助其他人寻求类似问题的解决方案。

标签: php pagination laravel-5 relationship


【解决方案1】:

我无法真正理解您的一些初始功能:

// $slug is not being used anywhere within the function
public function subcategoryListing($slug){

    // $idOfSubcat isn't passed to this function so will throw an error
    $products = Subcategory::find($idofSubcat)->products;

    return view('pages.subcategorylisting')
        ->with(array(
            'products' => $products,
        ));
}

如果您要做的只是对属于特定subcategory_idProducts 进行分页,假设您拥有subcategory_id,那么以下代码将起作用:

$products = Product::where('subcategory_id', $idofSubcat)->paginate();

然后您可以将这个分页集合返回到您的视图中,就像您已经在做的那样:

return view('pages.subcategorylisting')
    ->with(compact('products'));

【讨论】:

  • 你使用 compact() 的原因是什么?
  • @Pedrammarandi compact('products') 给出与[ 'products' =&gt; $products, ] 相同的结果。无论如何,我认为第二种形式(直接声明数组)在性能方面更好,因为它不必调用函数。
  • 你不需要使用compact,我只是提供了它作为我觉得读起来更自然一点的替代方案。与显式定义数组相比,它确实需要更多的资源 - 但根据您的问题,我看不出这会成为瓶颈。
【解决方案2】:

在 Eloquent(Laravel 的 ORM)中,当您将关系调用为属性($subCategory-&gt;products)时,它会根据关系类型(属于、拥有许多...)返回相关对象或对象集合。相反,如果您将其作为函数 ($subCategory-&gt;products()) 调用,您将获得一个 QueryBuilder 实例。

请参阅http://laravel.com/docs/5.1/eloquent-relationships#querying-relations,在关系方法与。动态属性了解更多详情。

无论如何,使用关系方法,您可以调用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,
        ));
}

【讨论】:

    【解决方案3】:

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

    表格类别

    id    category_name   parent_id(nullable)  
    

    和产品

     id          category_id        product_title      description     price
    

    比较好用,可以去掉一个Subcategory模型,全部放在Category里面。

    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');
        }
    }
    

    产品型号

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Products extends Model
    {
        protected $table = 'products';
    
        public function category() {
             return $this->belongsTo('App\Category')
        }
    
    
    }
    

    然后,就可以得到查询结果了

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

    但是,现有的不是漂亮的东西。您真的确定产品只会属于一个类别吗?)

    【讨论】:

    • 基本上,我有类别和子类别,产品属于子类别,不同的产品属于不同的子类别,也会有多个类别。以上解决方案在我的情况下不起作用
    猜你喜欢
    • 2019-10-02
    • 2015-11-29
    • 2014-03-02
    • 2017-12-19
    • 2021-03-19
    • 1970-01-01
    • 2021-02-09
    • 2016-08-03
    • 2013-04-03
    相关资源
    最近更新 更多