 Laravel по-русски
Laravel по-русски
      
      
    Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день дорогие форумчане. С новым всех годом!
Помогите пожалуйста решить задачку.
Смотрите.
У меня есть PostController с методом store
например
public function store(PostsRequest $request)
    {
        Post::create($request->all());
        return Redirect::back();
    }перед тем как создать что то данные валидируются в PostsRequest
И все конечно работает. Но тут мне понадобилось усложнить приложение.
Смотрите в чем проблема
Есть контроллер в который попадает массив с данными на базе которых мне нужно сгенерировать более 1 записи Post
то есть что я хочу сделать
public function storeMultiplePosts(MultiplePostsRequest $request)
{
$request_data  =  $request->all();
$data =  $request_data['exposts'];
foreach ($data as $item){
 (new PostController)->store($PostsRequest);
}
}иными словами мне вручную надо как то подготовить и сделать PostsRequest и передать его в PostController->store
Спасибо за помощь!
в разработке
Не в сети
Выноси создание одного поста в модель, буквально сегодня на похожий вопрос ответил. А еще лучше, выноси в модель и используй batch (bulk) insert, чтобы вставить данные одним запросом, а не создавать N отдельных запросов.
Изменено AlexeyMezenin (03.01.2017 12:19:32)
Не в сети
Выноси создание одного поста в модель, буквально сегодня на похожий вопрос ответил. А еще лучше, выноси в модель и используй batch (bulk) insert, чтобы вставить данные одним запросом, а не создавать N отдельных запросов.
одним запросом не выйдет. Так как данные что придут извне имеют еще кучу всего, настройки, отдельные модификации поста
мне надо вручную подготовить данные для валидации и сделать PostsRequest.
$request_data  =  $request->all();
$data =  $request_data['exposts'];опять же повторю.
ниже кусок кода лишь пример.
public function store(PostsRequest $request)
    {
        Post::create($request->all());
        return Redirect::back();
    }чтобы вставить данные одним запросом, а не создавать N отдельных запросов.
можно пример?
в разработке
Не в сети
Что бы было понятно напишу немного подробнее что я хочу что бы было
public function storeMultiplePosts(MultiplePostsRequest $request)
{
        $request_data  =  $request->all();
         $data =  $request_data['exposts'];
         foreach ($data as $item){
           $post_ = [];
                  /* куча кода что бы подготовить массив на основе того что есть в $item, так как дать гарантию не могу того что попадает в item ввиду того что эти данные приходят со стороннего ресурса */
                   /* плюс к этому на основании настроек что так же придут мне надо внести изменения отдельно в каждый пост. например в данном item не использовать текст или метки или дату публикации выставить другую
                 /* тот массив что я подготовил теперь нужно валидировать */
                //например как то так
                 $valid_post_data = new PostsRequest($post_ )
                       // и после того как уже мы проверили то что мы сгенерировали мы отправляем в контроллер
                (new PostController)->store($valid_post_data);
}
}в разработке
Не в сети
можно пример?
Судя по твоему коду (foreach и create), у тебя структура правильная для insert(). Тогда делаешь так:
public function storeMultiplePosts(MultiplePostsRequest $request)
{
    $rows = Post::insert($request->exposts);
}Если твой код был "левым", то нужно будет построить массив с правильной структурой для insert(). Структура такая:
$data = [
    ['name' => 'Vasya', 'city' => 'Moscow'],
    ['name' => 'John', 'city' => 'London']
];Изменено AlexeyMezenin (03.01.2017 13:50:25)
Не в сети
я вас понял спасибо.
Но тут есть одно но...
вы правильно сказали что структура левая. Она абсолютно левая.
на основе данных что приходят я могу сгенерировать массив.
Но мне его нужно валидировать. Так как самому богу известно что туда может попасть.
И вот как мне сделать валидацию? 
$data = [
    ['name' => 'Vasya', 'city' => 'Moscow'],
    ['name' => 'John', 'city' => 'London']
];К тому же у меня Request еще и занят предварительной подготовкой данных.
Небольшой пример из PostsRequest
    public function sanitize()
    {
        $input = $this->all();
        if (!isset($input['slug']) or empty($input['slug'])) {
            $input['slug'] = str_random(15) . '-' . Carbon::now()->toDateTimeString();
        }
        $input['slug'] = strtolower(preg_replace("/[\s_:]/", '-',preg_replace("/[\s-]+/", " ",$input['slug']) ));
        if ((!Auth::user()->able('posts_create')) or (!Auth::user()->able('posts_edit'))){
            $input['state'] = 1;
            $input['user_id'] = Auth::user()->id;
            $input['access'] = 1;
            $input['published_at'] = Carbon::now();
        }
        $this->replace($input);
        return $this->all();
    }в разработке
Не в сети
к сожалению мне не достаточно еще и создать запись. в методе стор еще кучу всего приходится делать(возможно я и не прав что это делаю именно в контроллере)
    public function store(PostsRequest $request)
    {
        $created_item = Post::create($request->all());
        $created_item->tags()->sync($this->gettaglist($request['tagstring']));
        
        if (isset($request['pictures']) && $request['pictures'])
            foreach ($request['pictures'] as $id) 
                $created_item->attach($created_item->user_id,'Picture',$id);
        if (isset($request['youtube']) && $request['youtube'])
            foreach ($request['youtube'] as $id) 
                $created_item->attach($created_item->user_id,'Youtube',$id);
      
        $posts_settings = NULL;
        if ($created_item and $created_item->state == 1 and isset($request['postssettings'])) {
            $posts_settings = PostsSetting::create(array_merge(['post_id' => $created_item->id ],$request['postssettings'])); 
        }
        if ($posts_settings) 
            event(new PostWasCreated($created_item,$posts_settings));
        $this->clearcache($created_item);
        return Redirect::back();
    }в разработке
Не в сети
вопрос пока открыт как вручную сделать Request что бы его потом передать в контроллер
в разработке
Не в сети
Вообщем нашел таки я решение... Если кому то еще понадобиться вручную работать с Request откопал у себя же решение в одном из проектов
                    $tagRequest = new Requests\TagRequest([
                        'title' => $tag_title,
                        'slug' => $tag_slug
                    ]);
                    $tagValidator = Validator::make($tagRequest->sanitize(), $tagRequest->rules());
                    if (!$tagVa->fails()) 
                        $tag = (new TagController())->store($tagRequest);Изменено fagtr (03.01.2017 15:50:28)
в разработке
Не в сети
Страницы 1