Красноречивые Простые Отношения, кажется, не работают - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь получить указанный c таймер с отношением к timer_themes, что-то вроде:

Timer::with('timer_theme')->find(1);

, но он возвращает:

>>> Timer::with('timer_theme')->find(1);
    => App\Timer {#3245
         id: 1,
         user_id: 1,
         slug: "test",
         end_time: "2020-03-25 21:59:14",
         is_locked: 1,
         created_at: "2020-03-24 18:26:33",
         updated_at: "2020-03-25 19:59:14",
         theme_id: 1,
         timer_theme: null,
       }

Мои модели настроить как это:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Timer extends Model
{
    protected $table = 'timers';

    protected $fillable = [
        'user_id',
        'slug',
        'end_time',
        'is_locked',
        'timer_theme_id'
    ];

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

    public function user() {
        return $this->belongsTo('App\Models\User');
    }
}

и

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TimerTheme extends Model
{
    protected $table = 'timer_themes';

    protected $fillable = [
        'id',
        'name',
        'css_path',
        'view_path'
    ];

    public function timerThemeOptions() {
        return $this->hasMany('App\TimerOptions');
    }

    public function timer() {
        return $this->hasMany('App\Timer');
    }
}

Это мои таблицы базы данных:

timers
-------
id
user_id
slug
end_time
is_locked
theme_id

и

timer_themes
-------------
id
name
view_path
css_path

I ' мы перепутали отношения в моделях, но так и не нашли решение, которое будет работать.

1 Ответ

2 голосов
/ 26 марта 2020

Ваши отношения настроены правильно и работают должным образом:

https://implode.io/944GOS

Тем не менее, макет базы данных, код и выходные данные отладки вы при условии, что есть некоторые конфликты в имени внешнего ключа для таблицы timer_themes.

Убедитесь, что в вашей таблице timers есть столбец с именем timer_theme_id, и тогда ваши модели должны выглядеть следующим образом:

<?php

namespace App;

use App\Timer;
use App\TimerOptions;
use Illuminate\Database\Eloquent\Model;

class TimerTheme extends Model
{
    protected $fillable = [
        'id',
        'name',
        'css_path',
        'view_path'
    ];

    // renamed this method for consistency
    public function timer_options()
    {
        return $this->hasMany(TimerOptions::class);
    }

    public function timer()
    {
        return $this->hasMany(Timer::class);
    }
}
<?php

namespace App;

use App\TimerTheme;
use App\Model\User;
use Illuminate\Database\Eloquent\Model;

class Timer extends Model
{
    protected $fillable = [
        'user_id',
        'slug',
        'end_time',
        'is_locked',
        'timer_theme_id'
    ];

    public function timer_theme()
    {
        return $this->belongsTo(TimerTheme::class);
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Вам лучше указывать имена классов программно, а не в виде строки, если они меняются. Обратите внимание, что указывать имя таблицы для вашей модели необязательно, если вы используете стандартные соглашения об именах. (Это не больно, конечно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...