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
左加入categories
products
.category_id
=categories
.id
左加入articles
products
.article_id
=articles
.id
其中id
= 1 group byarticles
.article_name
order byid
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 Vue Js Api中的关系从多个表中删除数据
laravel 返回与 eloquent 和 laravel 的关系