Laravel 5.4中Pages与Images的Eloquent关联配置问题
解决Laravel 5.4 Eloquent关联双条件匹配的问题
你已经搭好基础的模型和关联了,现在就差给关联加上template_id的匹配条件对吧?我给你梳理两种实用方案,适配不同的使用场景:
方案一:把双条件设为关联的默认规则
如果每次查询页面的关联图片,都需要同时满足item_id = 页面id和template_id = 页面自身的template_id,那直接修改Page模型的关联定义就行,用whereColumn来匹配两个表的对应字段:
// app/Page.php namespace App; use Illuminate\Database\Eloquent\Model; class Page extends Model { // 其他模型代码... public function images() { return $this->hasMany(Image::class, 'item_id') ->whereColumn('images.template_id', 'pages.template_id'); } }
配置好之后,在Tinker里直接调用关联就会自动应用双条件:
// Tinker命令 $page = App\Page::find(1); $page->images; // 自动返回item_id=1且template_id与该page的template_id一致的图片
方案二:动态添加双条件(适配特定查询场景)
如果只是部分查询需要这个双条件,不想改动默认关联,那可以在查询时通过闭包动态追加条件:
查询单个页面的关联图片
// Tinker命令 $page = App\Page::find(1); // 可以用页面自身的template_id,也可以直接指定某个固定值 $targetTemplateId = $page->template_id; $images = $page->images()->where('template_id', $targetTemplateId)->get();
批量预加载时追加双条件
如果要批量查询页面并预加载符合条件的图片,这么写就行:
// Tinker命令 $pages = App\Page::with(['images' => function ($query) { // 这里可以指定固定template_id,或者用whereColumn匹配页面的template_id $query->whereColumn('images.template_id', 'pages.template_id'); }])->get();
小提醒
- 确认你的
images表确实有item_id和template_id字段,pages表也存在template_id字段,而且字段类型要匹配(比如都是整数类型)。 - 如果你的
template_id是关联到模板表的外键,也可以基于这个逻辑扩展关联,但当前场景下上面的写法已经完全够用了。
内容的提问来源于stack exchange,提问作者Friendly Code
相关产品推荐
相关产品推荐

