关联模型中使用 with 方法做字段筛选报错

这是我的模型的方法:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class EduGradation extends Model
{
    // 获取分类的列表
    public static function getList(){
         return $model = self::open()->with('subjects:id, name')->get();
    }
    // 定义每个分类的对应的科目
    public function subjects(){
        return $this->belongsToMany('App\Models\EduSubject', 'edu_gradation_subject');
    }
}

当前模型也有id字段,
如果我在getList函数里面写了with('subjects:id, name')这个字段筛选的时候,就会产生sql报错,报错如下。

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in field list is ambiguous (SQL: 
select `id`, ` name`, `edu_gradation_subject`.`edu_gradation_id` as `pivot_edu_gradation_id`, `edu_gradation_subject`.`edu_subject_id` as `pivot_edu_subject_id` from `edu_subjects` inner join `edu_gradation_subject` on `edu_subjects`.`id` = `edu_gradation_subject`.`edu_subject_id` where `edu_gradation_subject`.`edu_gradation_id` in (1, 2, 3, 4, 5))

貌似是id字段不明,
当时我的with('subjects')方法里面不加参数的时候,就可以使用。或者使用with('subjects, name')的时候,也是可以的。
使用的laravel版本5.7

官方文档上也是这么说的。
下面是官方文档说明:

指定特定列的渴求式加载
也许你需要加载的关联数据的字段并不多。Eloquent 允许你在加载关联数据时指定字段,就像这样:
$users = App\Book::with('author:id,name')->get();
{note} 当你使用这个特性时,你应该永远将 id 包含进来。

这是为何?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

最近开发也遇到相同的问题,其问题的产生是正如错误提示所说,系字段不明确造成的。 这里可以直接在造成字段不明确的地方增加字段所在的表名(不需要前缀),如下: 假设 EduSubject 模型的表明系:edu_subjects

public static function getList(){
  return $model = self::open()->with('subjects:edu_subjects.id, name')->get();
}

尽管这个问题在一年前就提出了,但还是回答一下,以便后来者解决的问题

3年前 评论
讨论数量: 2

我用的时候是获取的值为null,倒没有出错,但是一直不知道哪里出问题

4年前 评论

最近开发也遇到相同的问题,其问题的产生是正如错误提示所说,系字段不明确造成的。 这里可以直接在造成字段不明确的地方增加字段所在的表名(不需要前缀),如下: 假设 EduSubject 模型的表明系:edu_subjects

public static function getList(){
  return $model = self::open()->with('subjects:edu_subjects.id, name')->get();
}

尽管这个问题在一年前就提出了,但还是回答一下,以便后来者解决的问题

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!