【问题标题】:Eloquent hasmany relationship issue雄辩有很多关系问题
【发布时间】:2015-11-01 17:21:27
【问题描述】:

我正在使用 Eloquent 为数据库构建一个带有 lumen 微框架的 API。

当我使用此代码从组中获取购物清单时,一切正常

$group =  Group::with(['shoppingLists' => function($query) {
        }])->get();

它返回以下对象

{
        "id": "797799c2-6044-4a3a-a3a6-a71fbb17de68",
        "name": "'t snackske",
        "description": "best group ever",
        "user_id": "7e74223a-ea06-46bf-ab1a-abb01b287e32",
        "created_at": "2015-08-09 20:06:40",
        "updated_at": "2015-08-09 20:06:40",
        "shopping_lists": [
            {
                "id": "2423eb3c-7dab-4672-b382-895788dec6a0",
                "name": "shop",
                "description": "food",
                "user_id": "7e74223a-ea06-46bf-ab1a-abb01b287e32",
                "group_id": "797799c2-6044-4a3a-a3a6-a71fbb17de68",
                "created_at": "2015-08-09 20:06:40",
                "updated_at": "2015-08-09 20:06:40"
            }
        ]
}

当我检查记录的查询时,我得到以下查询:

{
    "query": "select * from `groups`",
    "bindings": [],
    "time": 0.31
},
{
    "query": "select * from `shopping_lists` where `shopping_lists`.`group_id` in (?)",
    "bindings": [
        "797799c2-6044-4a3a-a3a6-a71fbb17de68"
    ],
    "time": 0.34
}

但是当我尝试为购物清单选择特定字段时,此查询不返回任何记录 查询生成器:

$group =  Group::with(['shoppingLists' => function($query) {
            $query->addSelect('id', 'name', 'description');
        }])->get();

回应:

{
        "id": "797799c2-6044-4a3a-a3a6-a71fbb17de68",
        "name": "Group",
        "description": "testgroup",
        "user_id": "7e74223a-ea06-46bf-ab1a-abb01b287e32",
        "created_at": "2015-08-09 20:06:40",
        "updated_at": "2015-08-09 20:06:40",
        "shopping_lists": []
}

getQueryLog 函数的查询

{
    "query": "select * from `groups`",
    "bindings": [],
    "time": 0.23
},
{
    "query": "select `id`, `name`, `description` from `shopping_lists` where `shopping_lists`.`group_id` in (?)",
    "bindings": [
        "797799c2-6044-4a3a-a3a6-a71fbb17de68"
    ],
    "time": 0.32
}

当我从 mysql 的查询日志中复制并粘贴最后一个查询时,我得到了正确的行。出于某种原因,eloquent 没有显示来自 shopping_lists 的数据。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Group extends Model
{
    protected $increments = false;

    protected $fillable = [
        'id',
        'name',
        'description',
        'user_id'
    ];

    protected $primaryKey = 'id';

    /**
     * Get shoppinglists from this group
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function shoppingLists()
    {
        return $this->hasMany('App\ShoppingList', 'group_id', 'id');
    }
}

【问题讨论】:

  • 两个表共享相同的列名,因此您可能需要在 select 语句中显式声明表名。 $query-&gt;addSelect('shoppingLists.id', 'shoppingLists.name', 'shoppingLists.description');
  • 我曾尝试将其与 '$query-&gt;addSelect('shopping_lists.id') 一起使用,但没有成功。通常这应该不是问题,因为查询构建器中的with() 函数会执行第二条语句。 @Jeemusu
  • 您可能必须将group_id 列添加到addSelect() 方法才能实现外键约束。
  • 今晚我会试试看。暂时无法访问我的电脑。提前致谢

标签: laravel-5 eloquent relationships lumen


【解决方案1】:

您可能需要将外键列添加到 Laravel 的 addSelect() 方法才能做到这一点。

Group::with(['shoppingLists' => function($query) {
    $query->addSelect('id', 'group_id', 'name', 'description');
}])->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2020-07-03
    • 2014-10-18
    • 2015-04-28
    • 2020-04-10
    • 2020-09-25
    相关资源
    最近更新 更多