Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 01.11.2015 20:13:49

Arat
Откуда: Киев
Сообщений: 116

Помощь в связях

Ребята, доброго времени суток!
Нубский вопрос. Есть таблица articles, есть таблица authors, есть таблица tags, есть пивотная таблица articles_tags.
Задача тривиальная. Нужно при выводе всех статей на сайте (через paginate() в контроллере) выводить его автора и тэги. Используя связи, через Article::find($id)->tags() работает. Но это для конкретной статьи… А как для всех я ХЗ пока :( Расскажите нубу как делать! Спасибо!

Не в сети

#2 02.11.2015 02:02:13

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: Помощь в связях

не видно связей у вас, но если

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.

Не в сети

#3 02.11.2015 11:57:32

Arat
Откуда: Киев
Сообщений: 116

Re: Помощь в связях

Не пошло. Значит через джоины буду пробовать. Хотя еще ими не владею sad

Не в сети

#4 02.11.2015 12:56:15

Arat
Откуда: Киев
Сообщений: 116

Re: Помощь в связях

Нубский вопрос. Есть 4 таблицы БД: articles, tags, articles_tags, authors.
Tags
Articles
Authors
articles_tags
Есть контроллер статей:

PHP
    <?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]);
    }
}

Есть модель Tag.php:

PHP
    <?php

    
namespace App;

    use 
Illuminate\Database\Eloquent\Model;

    class 
Tag extends Model
    
{
        public static function 
articles() {
        return 
$this->belongsToMany('App\Article');
    }
    }

Есть модель Article.php:

PHP
    <?php

    
namespace App;

    use 
Illuminate\Database\Eloquent\Model;

    class 
Article extends Model
    
{

    public static function 
tags() {
        return 
$this->belongsToMany('App\Tag');
    }
    }

Есть вьюха:

PHP
    @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>
                <
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

В итоге выдает

PHP
    FatalErrorException in ArticleController.php line 27:
    
Call to undefined method Illuminate\Database\Eloquent\Collection::tags()

Задача стоит, что вывести статьи, их теги и авторов. Laravel только учу, подскажите как правильно составить запросы для вывода всей информации? Спасибо!

Не в сети

#5 02.11.2015 22:40:22

Николай

Re: Помощь в связях

Зачем статические методы в моделях? Если ларавел 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]);
    }

#6 03.11.2015 10:39:43

Arat
Откуда: Киев
Сообщений: 116

Re: Помощь в связях

Что это решит? Я смогу выводить Нужные мне теги к каждой статье в общем их списке?

Не в сети

#7 06.11.2015 13:16:25

Arat
Откуда: Киев
Сообщений: 116

Re: Помощь в связях

Решение проблемы, вдруг не я один такой ☺

PHP
//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));
  }
}
PHP
//Article.php

class Article extends Model
{

  public function 
tags() {
    return 
$this->belongsToMany('App\Tag');
  }

  public function 
author() {
    return 
$this->belongsTo('App\Author');
  }
}

Не в сети

Подвал раздела