Русское сообщество разработки на 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