我有一个标签系统,您可以在其中为照片和用户添加标签。
我有一个功能,用户可以添加自己喜欢的标签,并根据这些标签选择图像
但我的问题我是一个非常大的初学者用PHP和laravel,我不知道如何将值传递给whereIn函数
模型
public function tag()
{
return $this->belongsToMany('Tag', 'users_tag');
}
控制器
// get the logged in user
$user = $this->user->find(Auth::user()->id);
// get tags relation
$userTags = $user->tag->toArray();
// select photos based on user tags
$photos = Photo::whereHas('tag', function($q) use ($userTags)
{
$q->whereIn('id', $userTags);
})->paginate(13);
$trendyTags = $this->tag->trendyTags();
$this->layout->title = trans('tag.favorite');
$this->layout->content = View::make('main::favoritetags')
->with('user', $user)
->with('photos', $photos)
->with('trendyTags', $trendyTags);
当我通过时我得到一个错误
preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
比我尝试使用array_flatten()
来清理我的数组
// get the logged in user
$user = $this->user->find(Auth::user()->id);
// get tags relation
$userTags =array_flatten($user->tag->toArray());
// select photos based on user tags
$photos = Photo::whereHas('tag', function($q) use ($userTags)
{
$q->whereIn('id', $userTags);
})->paginate(13);
$trendyTags = $this->tag->trendyTags();
$this->layout->title = trans('tag.favorite');
$this->layout->content = View::make('main::favoritetags')
->with('user', $user)
->with('photos', $photos)
->with('trendyTags', $trendyTags);
这种方式有效,但没有返回正确的标签。
请问有人可以帮我一把吗?
答案 0 :(得分:4)
当然,我会提出一些建议。
要获取用户模型,您只需使用$user = Auth::user()
。
要使用whereIn()
,它需要一维用户ID数组。 toArray()
函数将返回一个包含所有用户及其属性的关联数组,因此它无法正常工作。要获得所需内容,您应该使用lists('id')
。
最后一件真正帮助我的事情是当你建立一个将要返回一组对象(hasMany
,belongsToMany()
)的关系时,建立关系名称plurual,所以在这种情况下,您可以将tag()
函数修改为tags()
。
所有这一点,这应该适合你。
// get the logged in user
$user = Auth::user();
// get tags relation
$userTags = $user->tags()->lists('id');
// select photos based on user tags
$photos = Photo::whereHas('tags', function($q) use ($userTags)
{
$q->whereIn('id', $userTags);
})->paginate(13);
$trendyTags = $this->tags->trendyTags();
$this->layout->title = trans('tag.favorite');
$this->layout->content = View::make('main::favoritetags')
->with('user', $user)
->with('photos', $photos)
->with('trendyTags', $trendyTags);
我建议修改你的关系......虽然不是很重要。
public function tags()
{
return $this->belongsToMany('Tag', 'users_tag');
}