【问题标题】:Having difficulties displaying all content on my wishlist table在我的愿望清单上显示所有内容时遇到困难
【发布时间】:2019-10-19 06:09:29
【问题描述】:

我正在尝试为特定用户检索愿望清单表上的数据,到目前为止,它只检索表上的第一个数据,只返回一个数组而不是表中具有相同用户 ID 的三个数组

 public function getWishlistByUserId($id){
    $wishlists = Wishlist::where('userId', $id)->get();
    foreach($wishlists as $wishlist){
        $products = Product::where('id', $wishlist->productId)->get();
        return $products;
    }
}

【问题讨论】:

  • 这里有一堆问题...您正在循环,但循环中的 return 语句不会做任何事情。在查询单个 ID 时使用 ->get() 是多余的,因为它将返回单个 ProductCollection;可以使用->first() 来获取产品,由于在循环中调用额外的查询而效率低下(即,如果该用户有 1000 个愿望清单,它将调用 1000 个数据库查询)等等。考虑重构,使用关系,研究推送数据到数组中,等等。

标签: php laravel


【解决方案1】:

这是因为foreach 循环在第一次迭代期间返回了一个值。将您的 return 语句放在循环之外。你也可以通过使用relationships来提高你的表现。

一个例子可以是:

// Product.php
public function wishlists()
{
    return $this->hasMany(Wishlist::class);
}

// Your method
public function getWishlistByUserId($id)
{
    return Product::whereHas('wishlists', function ($query) use ($id) {
        $query->where('userId', $id);
    });
}

【讨论】:

  • 可能是 belongsTo 而不是 hasMany 但如果没有 DB 架构,我们无法确定。
【解决方案2】:

理想情况下这是 n+1 的情况

所以我建议使用 laravel 关系,如:

在您的名单模型中

public function product(){
    return $this->hasMany(Product::class,'productId','id');
}

通过关系获取数据

 public function getWishlistByUserId($id){
    $wishlists = Wishlist::with('product')->where('userId', $id)->get();
}

【讨论】:

    【解决方案3】:

    我终于可以这样工作了,我只是将结果推入一个数组,然后在循环外返回,谢谢大家的帮助

    public function getWishlistByUserId($id){
    
    
        $wishlists = Wishlist::where('userId', $id)->get();
    
        $wishlist = [];
        foreach($wishlists as $wish){
        $product = Product::where('id', $wish->productId)->get();
        array_push($wishlist, $product);
        }
        return $wishlist;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多