Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Ребята, доброго времени суток!
Нубский вопрос. Есть таблица articles, есть таблица authors, есть таблица tags, есть пивотная таблица articles_tags.
Задача тривиальная. Нужно при выводе всех статей на сайте (через paginate() в контроллере) выводить его автора и тэги. Используя связи, через Article::find($id)->tags() работает. Но это для конкретной статьи… А как для всех я ХЗ пока Расскажите нубу как делать! Спасибо!
Не в сети
не видно связей у вас, но если
Article::find($id)->tags()
работает, значит связь есть. Должно выводить
foreach (Article::all() as $item)
{
echo $item->tags->name; // вывод конкретного поля, к примеру name, или объект $item->tags()
}
Если бы небыло связей, то через джойны.
If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.
Не в сети
Не пошло. Значит через джоины буду пробовать. Хотя еще ими не владею
Не в сети
Нубский вопрос. Есть 4 таблицы БД: articles, tags, articles_tags, authors.
Tags
Articles
Authors
articles_tags
Есть контроллер статей:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Article;
use App\Author;
use App\Tag;
class ArticleController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$articles = Article::where('active', 1)->orderBy('created_at')- >paginate(5);
foreach ($articles as $article) {
$authors = Author::find($article->author_id);
}
$tags = $articles->tags();
// dd($articles);
return view('pages.articles', ['articles' => $articles, 'authors' => $authors, 'tags' => $tags]);
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Tag extends Model
{
public static function articles() {
return $this->belongsToMany('App\Article');
}
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
public static function tags() {
return $this->belongsToMany('App\Tag');
}
}
@foreach($articles as $article)
<article class="row article-block">
<div class="col-lg-2">
<time class="icon">
<em>{{ Date::parse($article->created_at)->format('l') }}</em>
<strong>{{ Date::parse($article->created_at)->format('F') }}</strong>
<span>{{ Date::parse($article->created_at)->format('j') }}</span>
</time>
<div>
{{ Date::parse($article->created_at)->format('F') }} {{ Date::parse($article->created_at)->format('Y') }}
</div>
<div>
{{ Date::parse($article->created_at)->format('j') }}
</div>
<div>
<i class="fa fa-eye"></i> {{ $article->view }}
</div>
<div>
<a href="/authors/view/{{ $article->author_id }}">{{ $authors->firstName }} {{ $authors->lastName }}</a>
</div>
<div>
@foreach($tags as $tag)
{{ $tag->name }},
@endforeach
</div>
</div>
@endforeach
FatalErrorException in ArticleController.php line 27:
Call to undefined method Illuminate\Database\Eloquent\Collection::tags()
Задача стоит, что вывести статьи, их теги и авторов. Laravel только учу, подскажите как правильно составить запросы для вывода всей информации? Спасибо!
Не в сети
Зачем статические методы в моделях? Если ларавел 5 используется, то передавайте в связи класс, типа:
public function tags() {
return $this->belongsToMany(Tag::class);
}
Добавьте связь autor к модели Article, я так понимаю там у вас связь один к одному используется.В итоге сможете подчистить свой контроллер. А связи используйте во вьшках, ваш контроллер должен выглядеть так:
public function index()
{
$articles = Article::where('active', 1)->orderBy('created_at')->paginate(5);
return view('pages.articles', ['articles' => $articles]);
}
Что это решит? Я смогу выводить Нужные мне теги к каждой статье в общем их списке?
Не в сети
Решение проблемы, вдруг не я один такой
//ArticleController.php
class ArticleController extends Controller
{
public function index()
{
$articles = Article::with('author', 'tags')->where('active', 1)->orderBy('created_at')->paginate(5);
return view('pages.articles', array('articles' => $articles));
}
}
//Article.php
class Article extends Model
{
public function tags() {
return $this->belongsToMany('App\Tag');
}
public function author() {
return $this->belongsTo('App\Author');
}
}
Не в сети
Страницы 1