laravel отношение один-ко-многим равно нулю - PullRequest
1 голос
/ 08 апреля 2020

У меня есть 3 модели: пользователь, компания и филиал.

В блейд-файле я хочу иметь возможность отобразить филиал, к которому принадлежит компания пользователя.

На мой взгляд у меня должны быть следующие отношения:

Пользователь -> Компания: пользователь принадлежит компании, и у компании много пользователей, так что это отношение один ко многим.

Компания -> Филиал : Компания принадлежит филиалу, а филиал может иметь много компаний. Итак, еще раз отношение один ко многим.

У меня есть внешние ключи в таблице пользователей: company_id, которая ссылается на идентификатор в таблице компании. Еще один FK в таблице компании: branch_id, который ссылается на id в таблице филиалов.

В моем блейд-файле я хочу отобразить название ветви следующим образом: {{$ user-> company-> branch-> name}} где только имя является собственностью. Компания и филиал являются отношениями.

Мой запрос выглядит следующим образом:

 $users = User::with(['company','company.branche' => function($q){
            $q->select('name');
        }])->inRandomOrder()->paginate(24);
<?php

namespace App;

use App\Events\GeneralEvent;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Nicolaslopezj\Searchable\SearchableTrait;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable, SoftDeletes, HasRoles, SearchableTrait;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'gender', 'first_name','last_name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */

...



    public function company()
    {
        return $this->belongsTo(Company::class,'company_id');
    }   

}
<?php

namespace App;

use App\Events\GeneralEvent;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Nicolaslopezj\Searchable\SearchableTrait;

class Company extends Model
{
    use SoftDeletes, SearchableTrait;


    ...

    public function branche()
    {
        return $this->belongsTo(Branche::class);
    }   
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Nicolaslopezj\Searchable\SearchableTrait;

class Branche extends Model
{
    protected $fillable = [
        'name'
    ];

    protected $searchable = [
        'columns' => [
            'name' => 10,
        ],
    ];

    public function companies()
    {
        return $this->hasMany(Company::class);
    }
}

Однако, когда я выбрасываю $ user-> company, я получаю нулевое значение. Так что добавлять ветку после этого пока бессмысленно. Когда я сбрасываю пользователя, отношение появляется, но является нулевым. Я понятия не имею, где я иду не так. Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

5 голосов
/ 08 апреля 2020

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

 $users = User::with(['company','company.branche' => function($q){
            $q->select('id','name');
        }])->inRandomOrder()->paginate(24);

ИЛИ

 $users = User::with('company.branche:id,name')->inRandomOrder()->paginate(24);
0 голосов
/ 12 апреля 2020

Так что проблема была в том, что у меня был один из моих внешних ключей, указывающий на неправильную таблицу. Doh.

...