Laravel导出MySQL视图报错:1054未知列vw_winning_report.id
问题分析:Laravel导出时提示
vw_winning_report.id不存在的错误 我来帮你拆解这个问题的原因和解决办法:
问题原因
你创建的视图vw_winning_report里,把原表的id字段重命名成了tid,所以这个视图本身不存在id字段。而Laravel的模型默认会把id当作主键字段,当你点击导出时(通常这类导出工具会基于模型的默认配置构建查询),框架会自动尝试用id字段做排序、主键关联等操作,这就导致了数据库找不到该字段的报错。
至于列表页面能正常工作,大概率是因为你在列表查询里手动指定了排序字段(比如按created_at排序),没有触发框架对默认主键id的依赖。
解决方法
有两种可行的方案,你可以根据业务需求选择:
方案一:修改视图,添加/恢复id字段
如果业务允许视图里有id字段(哪怕是重复的,因为UNION ALL会保留所有数据),可以直接把视图的SQL调整为不重命名id:
CREATE VIEW vw_winning_report AS SELECT id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM trivial_winners UNION ALL SELECT id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM predict_and_win UNION ALL SELECT id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM party_with_bbn UNION ALL SELECT id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM happy_hour UNION ALL SELECT id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM grand_price;
如果需要视图里的每条数据有唯一标识,可以用UUID()生成唯一的id,同时保留原表的id:
CREATE VIEW vw_winning_report AS SELECT UUID() AS id, id AS original_id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM trivial_winners UNION ALL SELECT UUID() AS id, id AS original_id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM predict_and_win UNION ALL SELECT UUID() AS id, id AS original_id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM party_with_bbn UNION ALL SELECT UUID() AS id, id AS original_id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM happy_hour UNION ALL SELECT UUID() AS id, id AS original_id, msisdn, game_code, game_name, prize, total_per_day, user_channel, created_at FROM grand_price;
方案二:修改Laravel模型,指定正确的主键
不需要修改视图,直接在WinningReport模型里告诉Laravel,这个模型的主键是tid:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class WinningReport extends Model { // 指定视图对应的表名 protected $table = 'vw_winning_report'; // 把主键设置为视图里的tid字段 protected $primaryKey = 'tid'; // 如果tid不是自增类型(比如原表id是整数,但视图里只是字段别名),需要关闭自增标识 public $incrementing = false; // 如果tid不是整数类型,还要指定主键类型,比如字符串的话: // protected $keyType = 'string'; }
另外,如果你用的是Laravel Excel这类导出工具,还要检查导出类的query()方法里有没有硬编码按id排序的逻辑,如果有的话,改成按tid或者其他存在的字段(比如created_at)排序。
内容的提问来源于stack exchange,提问作者user11352561
相关产品推荐
相关产品推荐

