Laravel One to Many可在ids

时间:2017-11-07 02:20:50

标签: laravel model eloquent laravel-5.5

我有一个名为items的主表,它有许多其他表的外键,如(categoriessections等。)。

我在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传递给数据表。

这可能吗?

3 个答案:

答案 0 :(得分:1)

标准化数据库的The idea是为了避免重复数据并保持其他事物的完整性。

选项1:API资源

现在针对您的情况,如果您尝试使用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

输出将是预期的。

选项2:加载关系

执行此操作的其他方法是Eager LoadLazy 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)

我脑子里有两种选择。

  1. 使用连接表。参考https://laravel.com/docs/5.5/queries#joins
  2. 例如:

    $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();
    
    1. 使用雄辩的关系模型的关系。因此,您可以拨打电话,例如$data->category->name来拨打电话类别名称或$data->section->name来拨打电话栏目的姓名。参考:https://laravel.com/docs/5.5/eloquent-relationships#one-to-many
    2. 如果你想使用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'];