Laravel Красноречивые отношения не работают в restful api

#php #rest #laravel #eloquent #laravel-5.2

#php #rest #laravel #красноречивый #laravel-5.2

Вопрос:

У меня есть простая связь «один ко многим» в базе данных eloquent с двумя таблицами. Они отлично работают в моих обычных контроллерах. Но когда я использую их в своем контроллере Restful, он показывает мне ошибку класса ‘App / TVChannel’ не найден. В других контроллерах все работает нормально. Вот классы моделей:

TVChannel.php

 namespace App;
use IlluminateDatabaseEloquentModel;

class TVChannel extends Model {

protected $table = 'tv_channel';
protected $fillable = ['name', 'img', 'hex_color', 'total_views', 'user_id', 'created_ip'];

public function user() {
    return $this->belongsTo('AppUser', 'user_id');
}

public function dramas() {
    return $this->hasMany('AppDramas', 'channel_id');
}
}
 

Dramas.php

 namespace App;

use IlluminateDatabaseEloquentModel;
class Dramas extends Model {

protected $table = 'dramas';
protected $fillable = ['name', 'img', 'total_views', 'channel_id', 'user_id', 'created_ip'];

public function user() {
    return $this->belongsTo('AppUser','user_id');
}

public function channel() {
    return $this->belongsTo('AppTvChannel', 'channel_id');
}

public function episodes(){
    return $this->hasMany('AppEpisodes', 'drama_id');
}}
 

Вот код из моего обычного контроллера, где я использую ajax-запрос для загрузки большего количества драм

  public function loadMoreDrama(Request $request) {
    $all_dramas = Dramas::latest()->limit(10)->offset($request->input('offset'))->get();
    if (count($all_dramas) > 0) {
        $ajaxString = '';
        foreach ($all_dramas as $drama) {
            $ajaxString .= '<li class="collection-item avatar" id="delete-drama-' . $drama->id . '">
                                <img src="' . asset($drama->img) . '" class="circle">
                                <span class="title" id="d-title-' . $drama->id . '">' . $drama->name . '</span>
                                <p id="d-forselect-' . $drama->id . '" selectid="' . $drama->channel->id . '">' . $drama->channel->name . '</p>
                                <a href="#" onClick="myddropdown(' . $drama->id . ')" "id="d_dropdown_menu_' . $drama->id . '" data-activates="d_dropdown_' . $drama->id . '" data-alignment="right" class="custom-dropdown waves-effect waves-circle red-text dropdown-button secondary-content"><i class="material-icons">more_vert</i></a>
                                <ul id="d_dropdown_' . $drama->id . '" class="dropdown-content">
                                    <li><a href="#" class="grey-text text-darken-4" onClick="updateDrama(' . $drama->id . ', '' . $drama->img . '')">Update</a></li>
                                    <li class="divider"></li>
                                    <li><a href="#" class="grey-text text-darken-4" onClick="deleteDrama(' . $drama->id . ', '' . $drama->img . '')">Delete</a></li>
                                </ul>
                            </li>';
        }
        return Response::json([
                    'success' => true,
                    'msg' => $ajaxString
        ]);
    } else {
        return Response::json([
                    'success' => false,
                    'msg' => 'No Drama to show'
        ]);
    }
}
 

И вот эта функция, в которой я получаю эту ошибку:

 public function getLatestDramas(Request $request)
{
    $drama = Dramas::latest()
        ->limit(10)
        ->offset($request->input('offset'))
        ->get();
    if ($drama->count() > 0) {
            $channels = array();
        foreach($dramas as $d){
            $channels[]= $d->channel;
        }
        return $this->export(TRUE, $channels);
    } else {
        return $this->export(FALSE, 'no drama to show right now');
    }

}
 

Пожалуйста, скажите мне, где я ошибаюсь или что еще я должен сделать.
Спасибо.

Комментарии:

1. Можете ли вы добавить пространство имен в модели?

2. в вашем Dramas.php отношение channel() имеет неправильное имя класса, оно должно быть TVChannel вместо TvChannel учтите, что v отличается, и поскольку имена классов чувствительны к регистру, вы должны включить его как TVChannel::class, если они находятся в одном пространстве имен, в противном случае просто используйте class, чтобы вы могли получить правильную ссылку.

3. @MarekSkiba добавил пространства имен

4. @Sam вау .. я не заметил простой ошибки. Спасибо за это, это решило мою проблему. Пожалуйста, отправьте это как ответ, чтобы я мог выбрать правильный ответ. Еще раз спасибо.

5. добро пожаловать .. 🙂

Ответ №1:

У вас опечатка в Drama.php файл TvChannel должен быть TVChannel, так как имя модели — TVChannel. изменить

public function channel() {
return $this->belongsTo('AppTvChannel', 'channel_id');
}

Для

public function channel() {
return $this->belongsTo('AppTVChannel', 'channel_id');
}

Предыдущий код может работать в Windows, но не будет работать в Linux, поскольку Linux чувствителен к регистру.