【问题标题】:laravel select one column from joined tablelaravel 从连接表中选择一列
【发布时间】:2015-10-11 21:04:00
【问题描述】:

我被 eloquent 和 laravel 困住了。

如有任何帮助,将不胜感激。

设置:

posts_table

id | name | desc...

照片表

id | post_id | image_path

帖子模型

public function photo()
    {
        return $this->hasOne('App\Photo');
    }

照片模型

public function posts()
{
return $this->belongsTo('App\Flyer');
}

我想获取所有帖子,并且只获取属于每个帖子的一张图片,因为每个帖子可以有更多图片。 无法使用 eloquent 或 db builder 创建它。

编辑:还有一个 q :)

以及如何仅获取所需的列,例如 posts_table.name 和 photos_table.image_path

【问题讨论】:

  • 为什么来自photo模型的关系属于flyer?不应该是post吗?此外,如果一个帖子可以包含多张照片,您应该在 post 模型中使用 hasMany 而不是 hasOne
  • 您能否使用模型文件中的更多信息(例如文件名和类名)更新您的问题?

标签: laravel join eloquent inner-join


【解决方案1】:

为了轻松使用 Eloquent ORM,请将您的模型名称设为单数形式,如帖子使其发布。然后将列 id 从数据库重命名为 post_id。为别人做。 现在看看你的模型。

添加protected $primaryKey="post_id"; 为别人做。使用hasOne()hasMany() 其他方法加入表会让您头疼。它将为帖子模型post_id 生成主键和外键作为(modelname_id)关系。 现在写下您的关系以获取带有帖子的照片 在后期模型中

public function photos(){
    return $this->hasMany('App\Photo');

}

关系完成:)

在你的控制器中获取带有照片的帖子,你必须写

$posts=Post::with('photos')->get();

print_r($posts);exit;//检查它是否工作

它将为您提供每个帖子的所有照片 您必须使用嵌套循环来查看它们一个或多个。 作为 if($posts->photos){ foreach($posts->photos as $sn=>$photo) } 请尝试这个概念,它可能会帮助你:D

【讨论】:

  • 我一回到家就试试,tnx,每个帖子如何只获得一张照片?
【解决方案2】:

从这篇文章中我找到了答案:How to select just 1 child table item for each parent record?

我必须在原始 sql 中完成,也许重构为 eloquent 将是下一个任务。

SELECT posts.id, image_path 
  FROM (SELECT * FROM posts) posts 
  LEFT JOIN (SELECT * FROM photos_table GROUP BY posts_id) photos_table 
  ON  posts.id = posts_id

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 2020-10-08
    • 1970-01-01
    • 2020-08-17
    • 2022-01-03
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多