我有一个名为items
的主表,它有许多其他表的外键,如(categories
,sections
等。)。
我在one-to-many
表的其他表之间创建了items
关系,因此可以将每个类别分配给多个项目,以此类推。“/ p>
我想从其他表中获取items
表填充names
,而不仅仅是ID。
所以看起来应该是这样的:
{id: 1, category_name: first, section_name: x .. }
我得到的是:
{id: 1, category_id: 1, section_id, 1}
我可以只从查询中获取名称吗?因为我想将它们作为JSON传递给数据表。
这可能吗?
答案 0 :(得分:1)
标准化数据库的The idea是为了避免重复数据并保持其他事物的完整性。
现在针对您的情况,如果您尝试使用Laravel作为后端,则可以使用5.5版Laravel的新功能API Resources。它可以帮助您格式化对象(如模型或集合)的输出,以显示属性和关系。
因此,您可以在ItemResource
资源中执行以下操作:
应用\ HTTP \ ResourcesResources \ ItemResource.php 强>
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class ItemResource extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->user_id,
// To access relationship attributes:
'category_name' => $this->category->name,
'section_name' => $this->section->name,
];
}
}
然后在您的控制器中,您只需要创建一个新的ItemResource
实例并传递要返回的Item
对象:
use App\Http\Resources\ItemResource;
// some code
/**
* Show a single formatted resource.
*
* @param Item $item
* @return ItemResource
*/
public function show($item)
{
return new ItemResource($item);
}
// the rest of your code
输出将是预期的。
执行此操作的其他方法是Eager Load或Lazy Eager Load Item
对象中的关系,如下所示:
// some code
/**
* Return a single item object.
*
* @param integer $id
* @return ItemResource
*/
public function show($id)
{
$item = Item::find($id);
$item->load(['category','section','etc']); // all of your relationships
return $item;
}
// the rest of your code
这将输出$item
,但会输出嵌套数据,例如:
{
"id":51,
"name": "Some item name",
"category": {
"id": 21,
"name": "category name"
}
"section": {
"id": 21,
"name": "section name"
}
.
.
.
}
然后在您的视图中,您只需访问以下属性:
$item->category->name
答案 1 :(得分:1)
我脑子里有两种选择。
例如:
$data = DB::table('data')
->join('categories', 'categories.id', '=', 'data.category_id')
->join('sections', 'sections.id', '=', 'data.section_id')
->select('data.id', 'categories.name as category_name', 'sections.name as section_name')
->get();
$data->category->name
来拨打电话类别名称或$data->section->name
来拨打电话栏目的姓名。参考:https://laravel.com/docs/5.5/eloquent-relationships#one-to-many。 如果你想使用2号选项并希望将它放入行中,你可以使用Laravel Collection(地图功能)(https://laravel.com/docs/5.5/collections)
答案 2 :(得分:0)
您可以使用像
这样的laravel accessor方法来完成此操作class Item extends Model
{
/**
* Get the user's first name.
*
* @param string $value
* @return string
*/
public function getCategoryNameAttribute()
{ //Your model relation here
return $this->categories()->first()->category_name;
}
}
您可以使用section_name
执行相同的操作注意:强> 如果您想使用JSON
,请在商品模型中使用protected $appends = ['category_name'];