问题描述
$data = [
"user" => [
"img_profile" => "profileimage","username" => "myusername"
],"description" => "postdescription","img" => "postimg"
];
我设法使用以下 PHP 代码得到了这个,但我想从查询中得到这个,有什么办法吗?
$posts = posts::join('business','posts.user_id','=','business.user_id')
->join('cities','business.city_id','cities.id')
->select(
'posts.description as description','posts.img as img','business.name as name','business.img_profile as img_profile','business.username as username'
)
->where('business.city_id',$city)
->inRandomOrder()
->limit('10')
->get();
foreach($posts as $post){
$data[$i] = [
"user" => [
"username" => $post->username,"img_profile" => $post->img_profile
],"description" => $post->description,"img" => $post->img
];
$i++;
}
解决方法
问题的关键在于您认为自己在使用 Eloquent,但实际上并非如此——您正在使用 Query Builder。 Eloquent 处理模型之间的关系,因此您无需考虑表格。如果您使用的是 join()
,那么您就没有使用 Eloquent。
据我所知,您从 City
开始,选择与该城市相关的 Business
,然后从 Post
中随机选择 10 个 Business
?事情有点不清楚,因为您似乎使用了非常规的表名和列名,但希望这能让您知道从哪里开始。
第一步是建立关系;除了典型的“City
有很多Business
”和“Business
有很多Post
”之外,您还需要在 City
和Post
像这样:
class City extends Model
{
public function posts()
{
return $this->hasManyThrough(Post::class,Business::class);
}
}
一旦这种关系就位,您应该能够通过以下方式获得您想要的东西:
$city = City::find($city_id);
$data = $city
->posts()
->inRandomOrder()
->limit(10)
->with("business:id,name,img_profile,username")
->get();