У меня три стола.
Таблица 1: posts
// Хранение сообщений пользователя в Twitter
Таблица 2: tags
// Хранение тегов, используемых в сообщениях Twitter
Таблица 3: post_tag
// сводная таблица
Теперь я хочу ввести tag
, например. 'yolo' и получить все посты с этим хэштегом. Это довольно легко, и я сделал это так
Сообщение класса:
/**
* Get the tags associated with the post
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function tags()
{
return $this->belongsToMany('App\Models\Tag')->get(['tag']);
}
Тег класса:
/**
* Get the posts associated with the given tag
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function posts()
{
return $this->belongsToMany('App\Models\Post');
}
Доступ к данным:
/** @var Tag $tag */
try {
$tag = Tag::where('tag', urldecode($passedTag))->firstOrFail();
return response()->json(['posts' => $tag->posts->toArray()]);
} catch (ModelNotFoundException $e) {
return response()->json(['errors' => 'No query results for: '. $passedTag]);
}
Однако то, что я хочу дополнительно сделать, это также получить все другие теги, которые использовались для публикации. Например. пост имеет теги yolo
и swag
. Теперь, когда пользователь вводит yolo
, я хочу, чтобы приложение показывало все сообщения, помеченные yolo
, а также отображало все другие теги, которые есть у сообщения, в этом примере swag
. я сделал вот так
/** @var Tag $tag */
try {
$tag = Tag::where('tag', urldecode($passedTag))->firstOrFail();
$posts = $tag->posts;
$fData = [];
foreach ($posts as $index=>$post) {
/** @var Post $post */
$fData[$index] = $post->toArray();
$fData[$index]['tags'] = $post->tags();
}
return response()->json(['posts' => $fData]);
} catch (ModelNotFoundException $e) {
return response()->json(['errors' => 'No query results for: '. $passedTag]);
}
но поскольку я новичок в Laravel (Lumen), я уверен, что есть более быстрый способ сделать это. Любые советы, как бы я сделал это более производительным? Спасибо! :)