Я пытаюсь запустить 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 Спасибо за любую помощь!






Попробуйте что-нибудь вроде этого
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');
}
Вам необходимо указать как 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
положил их, но по-прежнему возвращается пустым
хорошо, это именно то, что я хотел, только как я могу получить доступ к данным компании? и я не хочу, чтобы он получал все данные компании, только имя и адрес, это возможно?
БОЛЬШОЕ спасибо, чувак, теперь я получаю BadMethodCallException в строке Builder.php 2405: вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: all (), изменил его, чтобы получить, но затем я получаю ErrorException в 25655af7bffbc458b6eeee304b4909253cf2c9dd.php в строке 58: Попытка получить свойство не-объекта (View: C: \ wamp64 \ www \ resources \ views \ pages \ joblist.blade.php)
Да, используйте get, а также добавьте условие @if ($job->company) в лезвие. я обновил ответ проверьте это
очень ценю последующие действия, теперь, когда все новые изменения сделаны, все отношения теперь возвращают пустую коллекцию, я сделал dd для $ joblist и проверил его !! Я смущен
да, это показывает вакансии, но не отношения к компаниям, пустые!
у вас есть поле company_id в таблице joborder?
да, я вижу поле company_id в каждом атрибуте joborder! но в отношении я получаю "company" => null
Вам следует вызвать
$company = $newInstance->company()->get();
вместо
$company = $newInstance->company();
в PageController:jobList.
Прямо сейчас вы сохраняете само отношение, а не связанные данные.
В качестве альтернативы вы можете получить доступ к company как к свойству, которое должно автоматически возвращать связанные данные вместо самого отношения:
$company = $newInstance->company;
3 часа на это, tnx. но коллекция возвращается пустой. У меня есть несколько вакансий с fkey company_id = 1 и компанией с id = 1, но я получаю нулевую или пустую коллекцию. Кстати, мне просто нужны имена и адрес. я использую правильное отношение здесь?
лично я бы придерживался красноречивых соглашений об именах laravel, тогда вам не нужно предоставлять дополнительные параметры для разрешения отношения. но ваша модель, следовательно, вам, скорее всего, не понадобится предоставлять внешние ключи, например return $this->belongsTo('App\Company', 'joborder_id'); в Joborder::company
Мое плохое, ваше отношение Joborder::company должно быть return $this->belongsTo('App\Company', 'company_id', 'company_id');. Чтобы получить только имя и адрес, вы можете использовать pluck, см. laravel.com/docs/5.6/collections#method-pluck
Хорошо! этот работает, он возвращает мне значения, но я не думаю, что это правильный способ сделать это, почему мы даже используем with, когда у нас уже есть настройки отношений, разве функция не делает работу за нас? кстати, как я могу получить доступ к данным моей компании и ограничить их выборкой только имени и адреса? и связаны ли данные каждой компании с ее работой?