【问题标题】:Laravel Eloquent relationship not working in restful apiLaravel Eloquent 关系在 restful api 中不起作用
【发布时间】:2016-10-17 10:34:22
【问题描述】:

我在 eloquent 数据库中有一个简单的一对多关系,有两个表。它们在我的普通控制器中运行良好。但是当我在我的 Restful 控制器中使用它们时,它显示我找不到 Class 'App/TVChannel' 的错误。在其他控制器中一切正常。以下是模型类:

TVChannel.php

namespace App;
use Illuminate\Database\Eloquent\Model;

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('App\User', 'user_id');
}

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

Dramas.php

namespace App;

use Illuminate\Database\Eloquent\Model;
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('App\User','user_id');
}

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

public function episodes(){
    return $this->hasMany('App\Episodes', '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');
    }

}

请告诉我哪里出了问题或者我应该做些什么。 谢谢。

【问题讨论】:

  • 可以给模型添加命名空间吗?
  • 在你的 Dramas.php channel() 关系中有错误的类名它应该是 TVChannel 而不是 TvChannel 考虑 v 是不同的,因为类名是区分大小写的,你应该将它包含为 TVChannel::class 如果它们在同一个命名空间中,否则只需使用类,这样您就可以获得正确的参考。
  • @MarekSkiba 添加了命名空间
  • @Sam wow .. 我没有注意到这个简单的错误。谢谢你,它解决了我的问题。请将其作为答案发布,以便我选择正确答案。再次感谢您。
  • 不客气.. :)

标签: php rest laravel eloquent laravel-5.2


【解决方案1】:

您在 Drama.php 文件中有错字 TvChannel 应该是 TVChannel,因为模型名称是 TVChannel。 改变

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

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

之前的代码可能在 Windows 上运行,但在 Linux 上不运行,因为 Linux 区分大小写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多