Laravel 从关系表返回记录

Posted

技术标签:

【中文标题】Laravel 从关系表返回记录【英文标题】:Laravel return records from relation table 【发布时间】:2016-11-01 16:35:15 【问题描述】:

您好,我想返回所选类别的产品列表。 我有两个通过关系表产品连接的表:

public function up()

    Schema::create('products', function (Blueprint $table) 
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->integer('article_id')->unsigned();
        $table->integer('category_id')->unsigned();
        $table->string('sn');
        $table->integer('quantity');
        $table->date('warranty');
        $table->timestamps();
    );

    Schema::table('products', function(Blueprint $table) 
        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('article_id')->references('id')->on('articles');
        $table->foreign('category_id')->references('id')->on('categories');
    );

 

和表格类别:

public function up()

    Schema::create('categories', function (Blueprint $table) 
        $table->increments('id');
        $table->string('category_name');
        $table->timestamps();
    );

产品型号:

public function user()
    return $this->belongsTo('App\User');


public function article()
    return $this->belongsTo('App\Article');


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

和类别模型:

public function products()
    return $this->hasMany('App\Product')->withTimestamps();

我在 phpmyadmin 中编写查询 SQL:

SELECT
        products.id,
        products.user_id,
        articles.article_name,
        categories.category_name,
        products.sn,
        products.quantity,
        products.warranty,
        products.created_at,
        products.updated_at,
        SUM(quantity) AS ilosc
        FROM
        products
        LEFT JOIN
        categories ON products.category_id = categories.id
        LEFT JOIN
        articles ON products.article_id = articles.id
        GROUP BY articles.article_name
        ORDER BY id;

此查询适用于 phpmyadmin,但我想在 Laravel 中编写方法。 我怎样才能返回分配给所选类别的产品列表?? 我要补充一点,所选类别是通过 ID CATEGORY 的 show 方法传递的:

public function show($id)
    $categories = Category::find($id);

    return view('categories.showcategory', compact('categories'));

我不想要一个解决方案,只是提示我怎么做。我找到了这个主题enter link description here,但我仍然不知道该怎么做;)

我将查询 SQL 转换为查询 laravel i 文件 CategoriesController:

public function show($id)
    $categories = Category::find($id);
    $productsList = DB::table('products')->select('products.id,
    products.user_id,
    articles.article_name,
    categories.category_name,
    products.sn,
    products.quantity,
    products.warranty,
    products.created_at,
    products.updated_at,
    SUM(quantity) AS ilosc')->from('products')->where('id' , '=' , $categories->id)->leftJoin('categories', 'products.category_id', '=', 'categories.id')->leftJoin('articles', 'products.article_id', '=', 'articles.id')->groupBy('articles.article_name')->orderBy('id')->get();

    return view('categories.showcategory', compact('categories', 'productsList'));

但是 Laravel 返回错误:

SQLSTATE[42S22]:未找到列:1054 未知列 'products.id,' 在'字段列表'中(SQL:选择products.id,作为``来自products 左加入categoriesproducts.category_id = categories.id 左加入articlesproducts.article_id = articles.id 其中id = 1 group by articles.article_name order by id asc)

在 swatkins 的帮助下,我编写了方法:

public function show($id)
$categories = Category::find($id);
$productsList = Category::with(['products' => function ($query) 
                  $query->where('category_id', 20);
              ])->get();
return view('categories.showcategory', compact('categories', 'productsList'));

Laravel 正确返回具有所选类别的产品,但仅当我编写 ID 类别时。在此方法中 ID 类别等于 20。

$query->where('category_id', 20);

如何动态传递 GET category_id 的值??

【问题讨论】:

【参考方案1】:

您已经有一个类别,您只需要预先加载产品关系:

public function show($id)
    $categories = Category::with(['products' => function ($query) 
                      $query->where('paid', true);
                  ])->find($id);

    // this will give you a child property on your category 
    // called 'products' that will be an array of associated 
    // Product objects

    return view('categories.showcategory', compact('categories'));

文档:https://laravel.com/docs/5.2/eloquent-relationships#eager-loading

【讨论】:

我在文件 CategoriesController 中写了这个方法:public function show($id) $categories = Category::find($id); $products = Category::with('products')->find($id)->get(); return view('categories.showcategory', compact('categories', 'products')); 在文件 showcategory 中我写了这个 foreach 循环:@foreach ($products as $product) $product->products @endforeach laravel 将所有产品返回给我,我想 laravel 只支付所选记录中的记录类别。类别 ID 在 GET 中传递。 您可以在with 调用中添加过滤语句。我已经用一个例子更新了我的答案。文档在“约束急切负载”下有点远 仍然返回数据库中的所有记录,而不仅仅是所选类别中的记录;(我写了这个:$products = Category::with(['products' => function ($query) $query->where('category_id', true); ])->findOrFail($id)->get();我怎样才能用 GET 传递给查询 id??我试过这个:@ 987654328@ 但是 Laravel 返回了 未定义的变量:类别 link 您与 products->category 是一对多的关系——因此,您的 products 表中不应有 category_id 字段。我们需要查看您的更多设置才能提供帮助。 看看我在 20 上更改 category_id 的 ID 数时:...$query->where('category_id', 19);... Laravel 仅从 ID=19 的类别正确返回产品。现在的问题是 如何动态传递 GET category_id 的值,而不是 19 ?? 整体:public function show($id) $categories = Category::find($id); $products = Category::with(['products' => function ($query) $query->where('category_id', 19); ])->get(); return view('categories.showcategory', compact('categories', 'products'));

以上是关于Laravel 从关系表返回记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从 hasManyThrough 雄辩关系返回 Laravel 中的单个模型

Laravel从模型中获取具有特定数据和关系的记录

根据Laravel Vue Js Api中的关系从多个表中删除数据

laravel 返回与 eloquent 和 laravel 的关系

从 Laravel 中的 Mysql Pivot 表中获取列并返回 JSON 对象

Laravel 4 belongsToMany 关系返回空