preg_match_all во всех полях ввода - PullRequest
0 голосов
/ 11 мая 2019

Я использую preg_match_all, чтобы найти имена пользователей в «теле» и сохранить их в базе данных. Как я могу найти имена пользователей в нескольких полях ввода, например: тело, заголовок и статья? И как я могу сохранить найденные ссылки в базе данных без сохранения повторяющихся записей?

if ($post) {
            preg_match_all('/\B@(\w+)/', $request->get('body'), $mentionedUsers);

            foreach ($mentionedUsers[1] as $mentionedUser) {

            $foundUser = User::where('username', $mentionedUser)->first();
                if(!$foundUser){
                    continue;
                }
            $foundUserId = $foundUser->id;
            $mentionedUser_save = new Mentioned_post_user;
            $mentionedUser_save->user_id_lead = Auth::user()->id;
            $mentionedUser_save->user_id = $foundUserId;
            $mentionedUser_save->post_id = $post->id;
            $mentionedUser_save->save();

            }
        }

1 Ответ

1 голос
/ 12 мая 2019

Вы можете использовать whereIn('user_name', $mentionedUsers) вместо запуска foreach.

if ($post) {
    // assuming this line works and mentioned users are in $mentionedUsers[1]
    preg_match_all('/\B@(\w+)/', $request->get('body'), $mentionedUsers);

    $foundUsers = User::whereIn('username', $mentionedUsers[1])->get();

    if ($foundUsers) {
        foreach ($foundUsers as $foundUser) {
            $foundUserId = $foundUser->id;
            $mentionedUser_save = new Mentioned_post_user;
            $mentionedUser_save->user_id_lead = Auth::user()->id;
            $mentionedUser_save->user_id = $foundUserId;
            $mentionedUser_save->post_id = $post->id;
            $mentionedUser_save->save();
         }
     }
}

В противном случае вам потребуется получить уникальные значения $mentionedUsers[1] с помощью array_unique().(Я бы предложил решение выше)


Редактировать: Извините, мысль, что ваша проблема была в другом.Для вашего решения я бы использовал подход, объединяющий все входные данные.

$theString = "$request->body $request->title $request->article";

preg_match_all('/\B@(\w+)/', $theString, $mentionedUsers);    

$userNamesArray = array_unique($mentionedUsers[1]);

$foundUsers = User::whereIn('username', $userNamesArray)->get();
...