@EVOSandru6

Почему в laravel может не работать hasMany связь?

Добрый день,

Есть 2 модели - Марки и Выпуски марок:

class Mark extends Model
{
    protected $table = 'marks';

    public function editions()
    {
        return $this->hasMany(Edition::class, 'mark_id');
    }
}

class Edition extends Model
{
    protected $table = 'editions';

    public function mark()
    {
        return $this->belongsTo(Mark::class);
    }
}


Проблема в вызове связи на живую модель данных (сами связочные данные в таблицах присутствуют),

class MarksController extends Controller
{
    public function show(Mark $mark)
    {
         dump($mark->name);
         dd($mark->editions());
    }
}


Хватаю:

Method Illuminate\Database\Query\Builder::editions does not exist.

Странно, например комментарии для статей по такому же принципу связи работают идеально.

Пробовал переименовывать метод связи - не помогло.

Например такая конструкция у меня работает:

Article::find(1)->comments()->create(['body'=>'haha','user_id'=>1])


Ааналогично:

Mark::find(1)->editions()->create(['name'=>AhAhAhA]);


Падает с аналогичной ошиибкой:
Method Illuminate\Database\Query\Builder::editions does not exist.

пробовал:

dd($mark->editions)
Ловлю null

Мне в итоге надо получить:

$editions = $mark->editions()->orderBy('sort')->get();


На что я ловлю вышеуказанную ошибку.

Склоняюсь - что проблема в модели:

namespace App\Entity\Vehicle;

use App\Entity\Behaviors\ImagePublicBehavior;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Notifications\Notifiable;

class Mark extends Model
{
....


Т.к. добавил сущность комментов для Марок, та же ошибка для:

$mark->comments()->create(['body' => 'xxx', 'user_id' => 1]);
         dd($mark->comments());


Illuminate\Database\Query\Builder::comments does not exist.

В чем может быть проблема? Подскажите пожалуйста.
  • Вопрос задан
  • 409 просмотров
Решения вопроса 1
@EVOSandru6 Автор вопроса
Название модели исправил с Mark на Brand, и ..... заработало. Чем ему Mark не нравился, ума не приложу. Я в тяжелом недоумении.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@vism
protected $table = 'editions';
Ответ написан
@Tanukin
Скобки не нужны для получения данных:
$mark->editions
Скобки используются для связи между таблицами, например для сохранения
$mark->editions()->save($editions)
Ответ написан
JhaoDa
@JhaoDa
LaravelRUS Team
Как обычно — ВДРУГ в вопросе появляются «незначительные» дополнения в виде
use App\Entity\Behaviors\ImagePublicBehavior;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Notifications\Notifiable;

Предлагаю отключить всё, кроме use Illuminate\Database\Eloquent\Model; и проверить. Если поможет, то включать по одному и опять проверять.

P.S. Автор, делай так и дальше — не выдавай всю информацию сразу. А то нам же тут скучно...
Ответ написан
@unreal_serg
Пробуй вместо get() использовать firstOrFail()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы