【问题标题】:Eloquent Relationship using DB Laravel使用 DB Laravel 的雄辩关系
【发布时间】:2017-01-16 14:05:37
【问题描述】:

我有 4 张桌子。

客户 工作 回合 工作轮次

我创建了以下关系:

Clients > Jobs
Jobs > Rounds

这是我的模型

客户

class Client extends Model
{   

    protected $dates = [
        'created_at',
        'updated_at',
        'last_done'
    ];


    public function Jobs()
    {
        return $this->hasMany('App\Job','client_id');
    }
}

工作

class Job extends Model
{
    protected $dates = [
        'created_at',
        'updated_at',
        'last_done',
        'due_date'
    ];

    public function Round()
    {
        return $this->belongsTo('App\Round','round_id');
    }

    public function Client()
    {
        return $this->belongsTo('App\Client','client_id');
    }
}

圆形

class Round extends Model
{
    protected $dates = [
        'created_at',
        'updated_at',
        'date_scheduled',
        'date_finished'
    ];

    public function Clients()
    {
        return $this->hasMany('App\RoundClients', 'round_id');
    }

    public function Jobs()
    {
        return $this->belongsToMany('App\Job', 'job_rounds', 'round_id', 'job_id');
    }
}

工作轮次

class JobRound extends Model
{
    public $timestamps = false;
}

在我的回合视图中,我正在输出所有不在回合中的工作以及所有在回合中的工作。

我通过创建一个 DB::table 来执行检查来做到这一点 - 请参阅我的代码:

public function show($id)
    {   
        $round = Auth::user()->rounds()->FindOrFail($id);

        $not = DB::table('jobs')->whereNotIn('id', function($query) use($round) {
        $query->select('job_id')
          ->from('job_rounds')
          ->where('round_id', $round->id);
        })->get();

        $are = DB::table('job_rounds')
        ->join('jobs', 'job_rounds.job_id', '=', 'jobs.id')
        ->select('job_rounds.*', 'jobs.*' ,'job_rounds.id as DAS')
        ->where('job_rounds.round_id',$round->id)
        ->get();   

        return view('app.round',compact('round','not','are'));
    }

在我看来,我遇到的问题是,用于输出客户端名称的客户端到作业的关系将不起作用,因为我创建了自己的数据库查询,我正在输出我的视图中的客户端信息,例如

工作机会

@foreach($are as $job)
  {{ $job->client->first_name }}
@endforeach

工作不全面

@foreach($not as $job)
  {{ $job->client->first_name }}
@endforeach

我得到错误:

未找到变量 $client 等

【问题讨论】:

  • 你定义了模型的关系吗?你能发布每个模型文件吗
  • @Carlos 我不熟悉在关系中这样做,我已经包含了上面的模型。
  • 为什么不使用基本的数据库表级关系?
  • @Sachith 因为工作可能与许多轮次有关。
  • 如果使用普通的数据库关系方式,每个job都有一个client,那么每个job round都有一个job.so自动job round和client关系建立。

标签: php laravel laravel-5 eloquent


【解决方案1】:

您的关系方法以大写字母开头(顺便说一句,您应该更改为以小写字母开头作为标准)。

问题是你的方法和你调用的方法不一样,你需要在两者中使用相同的大小写,像这样...

@foreach($are as $job)
    {{ $job->Client->first_name }}
@endforeach

更新

除此之外,您没有使用 Eloquent。
您只是直接使用数据库查询生成器。
要使用 Eloquent,您必须使用 Model 类的静态方法,如下所示:

Job::whereNoIn('id', .....

而不是这个:

DB::table('jobs')->whereNotIn('id', ....

【讨论】:

  • 感谢 Nestor,我已经尝试过了,但我仍然得到未定义的属性:stdClass::$Client
  • 哦,我明白了,你没有使用 Eloquent,这就是原因。您正在使用数据库查询生成器。如果你想使用 Eloquent,你必须调用 Class 静态方法,比如 Job::whereNotIn(..... 而不是 DB::table('jobs')。如果您不使用 Eloquent,则这些关系不可用。
  • 我想让代码在我的控制器中看起来更干净:( 哈。
【解决方案2】:

DB::table 不返回 App\Job 类。因此,您不能使用关系。 ($job->Client...)

尝试使用 Eloquent 进行查询。有关更多详细信息,请关注此官方 Laravel documantation

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 2018-11-28
    • 2015-01-11
    • 2021-06-03
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多