Отношение Laravel принадлежитTo не возвращает значения

Я пытаюсь запустить hasMany, но я действительно не знаю, почему я не получаю никакого результата! две таблицы: Company, Joborder, у каждого joborder есть название компании и адрес, который я хочу получить с помощью отношения ownTo в laravel

<?php
namespace App;

class Company extends Model
{
    protected $table      = 'company';
    protected $primaryKey = 'company_id';

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

Моя страница работы

<?php
namespace App;

class Joborder extends Model
{
    protected $table      = "joborder";
    public    $primaryKey = "joborder_id";
    protected $dates      = [
        'start_date',
        'created_at',
        'updated_at'
    ];

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

это PageController:

public function joblist() {
    $joblist     = Joborder::all();
    $newInstance = new Joborder;
    $company     = $newInstance->company();

    dd($company->name);
    dd($joblist);

    return view('pages.joblist')->with('jobs',$joblist);
} 

это дд с моей страницы после запуска

BelongsTo {#217 ▼
  #foreignKey: "company_id"
  #otherKey: "company_id"
  #relation: "company"
  #query: Builder {#218 ▶}
  #parent: Joborder {#205 ▼
    #table: "joborder"
    +primaryKey: "joborder_id"
    #dates: array:3 [▼
      0 => "start_date"
      1 => "created_at"
      2 => "updated_at"
    ]
    #guarded: array:1 [▼
      0 => "id"
    ]
    #fillable: []
    #connection: null
    #keyType: "int"
    #perPage: 15
    +incrementing: true
    +timestamps: true
    #attributes: []
    #original: []
    #relations: []
    #hidden: []
    #visible: []
    #appends: []
    #dateFormat: null
    #casts: []
    #touches: []
    #observables: []
    #with: []
    #morphClass: null
    +exists: false
    +wasRecentlyCreated: false
  }
  #related: Company {#212 ▼
    #table: "company"
    #primaryKey: "company_id"
    #guarded: array:1 [▼
      0 => "id"
    ]
    #fillable: []
    #connection: null
    #keyType: "int"
    #perPage: 15
    +incrementing: true
    +timestamps: true
    #attributes: []
    #original: []
    #relations: []
    #hidden: []
    #visible: []
    #appends: []
    #dates: []
    #dateFormat: null
    #casts: []
    #touches: []
    #observables: []
    #with: []
    #morphClass: null
    +exists: false
    +wasRecentlyCreated: false
  }
}

У меня есть company_id в компании как pkey и в joborder как fkey Спасибо за любую помощь!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
6 725
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте что-нибудь вроде этого

public function joblist() {
    $joblist = Joborder::with('company')->get();         
    return view('pages.joblist')->with('jobs',$joblist);
}

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

public function company(){
    return $this->belongsTo('App\Company', 'joborder_id');
}

Хорошо! этот работает, он возвращает мне значения, но я не думаю, что это правильный способ сделать это, почему мы даже используем with, когда у нас уже есть настройки отношений, разве функция не делает работу за нас? кстати, как я могу получить доступ к данным моей компании и ограничить их выборкой только имени и адреса? и связаны ли данные каждой компании с ее работой?

Pc Monk 13.08.2018 10:37

Вам необходимо указать как foreignKey, так и localKey в обоих отношениях, потому что у вас нет идентификатора в качестве первичного ключа.

Модель компании

public function jobs() {
     return $this->hasMany('App\Joborder','company_id','company_id');
}

Модель Joborder

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

Теперь возьми вот так

public function joblist() {
    $joblist = Joborder::with('company')->all();

    dd($joblist);

    return view('pages.joblist')->with($joblist);
} 

Если вам нужно получить выбранное поле компании, вы можете указать его в активной загрузке $query->select('name', 'address');.

public function joblist() {
    $joblist = Joborder::with(['company' => function($query){
                         $query->select('name', 'address');
               }])->get();

    return view('pages.joblist')->with($joblist);
} 

В лезвии вы можете получить доступ к данным компании следующим образом

@foreach($joblist as $job)
   @if ($job->company)
      {{$job->company->name}}
      {{$job->company->address}}
   @endif
@endforeach

положил их, но по-прежнему возвращается пустым

Pc Monk 13.08.2018 10:34

хорошо, это именно то, что я хотел, только как я могу получить доступ к данным компании? и я не хочу, чтобы он получал все данные компании, только имя и адрес, это возможно?

Pc Monk 13.08.2018 11:00

БОЛЬШОЕ спасибо, чувак, теперь я получаю BadMethodCallException в строке Builder.php 2405: вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: all (), изменил его, чтобы получить, но затем я получаю ErrorException в 25655af7bffbc458b6eeee304b4909253cf2c9dd.php в строке 58: Попытка получить свойство не-объекта (View: C: \ wamp64 \ www \ resources \ views \ pages \ joblist.blade.php)

Pc Monk 13.08.2018 11:33

Да, используйте get, а также добавьте условие @if ($job->company) в лезвие. я обновил ответ проверьте это

rkj 13.08.2018 11:48

очень ценю последующие действия, теперь, когда все новые изменения сделаны, все отношения теперь возвращают пустую коллекцию, я сделал dd для $ joblist и проверил его !! Я смущен

Pc Monk 13.08.2018 12:12

да, это показывает вакансии, но не отношения к компаниям, пустые!

Pc Monk 13.08.2018 12:39

у вас есть поле company_id в таблице joborder?

rkj 13.08.2018 13:02

да, я вижу поле company_id в каждом атрибуте joborder! но в отношении я получаю "company" => null

Pc Monk 13.08.2018 13:05
Ответ принят как подходящий

Вам следует вызвать

$company = $newInstance->company()->get();

вместо

$company = $newInstance->company();

в PageController:jobList.
Прямо сейчас вы сохраняете само отношение, а не связанные данные.

В качестве альтернативы вы можете получить доступ к company как к свойству, которое должно автоматически возвращать связанные данные вместо самого отношения:

$company = $newInstance->company;

3 часа на это, tnx. но коллекция возвращается пустой. У меня есть несколько вакансий с fkey company_id = 1 и компанией с id = 1, но я получаю нулевую или пустую коллекцию. Кстати, мне просто нужны имена и адрес. я использую правильное отношение здесь?

Pc Monk 13.08.2018 10:33

лично я бы придерживался красноречивых соглашений об именах laravel, тогда вам не нужно предоставлять дополнительные параметры для разрешения отношения. но ваша модель, следовательно, вам, скорее всего, не понадобится предоставлять внешние ключи, например return $this->belongsTo('App\Company', 'joborder_id'); в Joborder::company

Tschitsch 13.08.2018 10:46

Мое плохое, ваше отношение Joborder::company должно быть return $this->belongsTo('App\Company', 'company_id', 'company_id');. Чтобы получить только имя и адрес, вы можете использовать pluck, см. laravel.com/docs/5.6/collections#method-pluck

Tschitsch 13.08.2018 11:00

Другие вопросы по теме