Laravel 4 гдеIn и многие ко многим

У меня есть система тегов, где вы можете добавлять теги к фотографиям и пользователям.

У меня есть функция, в которой пользователи могут добавлять свои любимые теги и выбирать изображения на основе этих тегов.

Но моя проблема, я действительно большой новичок в 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);

Таким образом, он работает, но не возвращает правильные теги.

Может, пожалуйста, кто-нибудь может помочь мне в этом?


person Levi    schedule 12.06.2014    source источник


Ответы (1)


Конечно, и я сделаю пару рекомендаций.

Чтобы получить модель пользователя, вам просто нужно использовать $user = Auth::user().

Чтобы использовать whereIn(), он ожидает одномерный массив идентификаторов пользователей. Функция toArray() вернет массив ассоциативных массивов, содержащих всех пользователей и их свойства, поэтому она не будет работать правильно. Чтобы получить то, что вам нужно, вы должны использовать lists('id').

И последнее, что мне действительно помогло, это когда вы настраиваете отношение, которое будет возвращать набор объектов (hasMany, belongsToMany()), сделайте имя отношения множественным, поэтому в этом случае вы должны изменить свою функцию 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');
}
person user1669496    schedule 12.06.2014
comment
большое спасибо за подробный ответ, очень помогло, спасибо - person Levi; 12.06.2014