我正在将原有的PHP RESTful API项目迁移到Lumen API Project中。我被困在Eloquent Model的结构上,负责从数据库中获取,插入,更新或删除数据。我想知道模型的结构和映射。
以下是一些表结构:
stop {id, stop_name, stop_code, stop_status}
stop_detail {detail_id, stop_id, description, created_on, modified_on}
image {image_id, image_path, description, seq_order, is_thumb}
image_stop_mapping {stop_id, image_id, order}
place {place_id, place_title, description, place_status, order}
image_place_mapping {place_id, image_id, order}
现在,当我访问stop模型时,我希望能够在单个Model访问中访问stop_detail,stop_images,stop_places,place_images。它应该像
public function findByStopId($stopId) {
return Stop::where('id', $stopId)->with('stop_detail', 'stop_detail.stop_images', 'places', 'places.images')->get();
}
任何人都可以帮助我创建更好的Eloquent模型结构吗?
答案 0 :(得分:1)
例如,在你的停止模型中,你可能会有类似下面的内容,但我不确定实际的关系,所以请耐心等待。
class Stop extends Model {
public function stopdetails(){
return $this->hasMany(StopDetails::class, 'stop_id');
}
}
然后称之为:
public function findByStopId($stopId) {
return Stop::where('id', $stopId)->with('stopdetails')->get();
}
不知道总体结构等,但希望它能帮助您找到或至少为您提供一个启动器
答案 1 :(得分:0)
您想使用“预先加载”(https://laravel.com/docs/5.1/eloquent-relationships#eager-loading),对吧?
所以你写的方法非常好 - 如果应用知道关系。
基本上你可以猜测它们非常好(因为编写它的人使用了一个简单的命名约定。)
仅举例:image_stop_mapping {stop_id, image_id, order}
和stop_detail {id, stop_id, description, created_on, modified_on}
class Image extends Model
{
// ...
}
class ImageStopMapping extends Model
{
public function image()
{
return $this->belongsTo('App\Image');
}
public function stop()
{
return $this->belongsTo('App\Stop');
}
}
class Stop extends Model
{
public function stop_images()
{
return $this->hasManyThrough('App\Image', 'App\ImageStopMapping');
}
public function details()
{
return $this->hasMany('App\StopDetail');
}
}
class StopDetail extends Model
{
public function stop()
{
return $this->belongsTo('App\Stop');
}
}
没有测试,但这应该朝着正确的方向发展。