【问题标题】:Laravel 5.1 - retrieving a polymorphic association with WHERE clauseLaravel 5.1 - 使用 WHERE 子句检索多态关联
【发布时间】:2018-02-13 17:04:39
【问题描述】:

我在检索多态关联“where related_object.column_name = x”时遇到问题。让我解释一下:

我的数据库中有许多“页面”,每个页面与不同类型的“内容”具有多态关联。例如:

页面

slug:我的页面,id:1

slug : my-other page, id: 2

music_track 表

music_track:id 10,page_id:1

视频表

视频:id 20,page_id:2

图片表

图片:id 30,page_id:1

目录

id: 555, contentable_id 10, contentable_type: App\music_track

id: 556, contentable_id 20, contentable_type: App\video

id: 557, contentable_id 30, contentable_type: App\image

我可以使用 Content::all( ) 返回所有内容,如何返回 page_id 为“1”的所有内容?

我似乎无法使用 Content::where('page_id', "=", "1"),因为 page_id 不明确,或者被假定为内容表的一部分。如何查询 RELATED 表?

【问题讨论】:

  • 你的模型中定义了所有关系吗?

标签: php sql laravel laravel-5.1 polymorphic-associations


【解决方案1】:

试试这样的:

将此方法放入您的MusicTrackImageVideo 模型中:

/**
 * Return a list of related models based on page id
 *
 * @param \Illuminate\Database\Eloquent\Builder $query 
 * @param int $id 
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeOfPage($query, $id)
{
    return $query->where('page_id', $id);
}

那么,如果您在 Page 模型中拥有所有关系:

$images = $page->images()->ofPage($id)->get();
//
$music_tracks = $page->music()->ofPage($id)->get();
//
$videos = $page->videos()->ofPage($id)->get();

如果你没有它们,那么:

/**
 * Return a list of images which are included in this page.
 *
 * @return \Illuminate\Database\Eloquent\Relations\MorphToMany
 */
public function images()
{
    return $this->morphToMany('App\Image', 'contentable');
}

/**
 * Return a list of music tracks which are included in this page.
 *
 * @return \Illuminate\Database\Eloquent\Relations\MorphToMany
 */
public function music()
{
    return $this->morphToMany('App\Music', 'contentable');
}

/**
 * Return a list of music tracks which are included in this page.
 *
 * @return \Illuminate\Database\Eloquent\Relations\MorphToMany
 */
public function videos()
{
    return $this->morphToMany('App\Video', 'contentable');
}

【讨论】:

  • 谢谢。这很聪明,但我想在 page_id = $id 的地方返回 $content。上面的结果可以通过 Video::where('page_id', '=', $id) 简单实现
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2018-09-05
相关资源
最近更新 更多