У меня отношения «один ко многим» между двумя классами. Когда я пытаюсь получить дочерний элемент ownTo посредством активной загрузки, он не работает по какой-то странной причине. Согласно следующему, он должен работать: https://laravel.com/docs/master/eloquent-relationships#eager-loading
В таблицах есть, среди прочего, следующие столбцы (устаревшие, нет возможности изменить это). kasticket_.kassa_id и kassa.code относятся друг к другу:
kasticket_.ticketnr, kasticket_.kassa_id, ...
kassa.code, ...
Вот несколько упрощенные классы. ReceiptDetail:
<?php
namespace App;
use App\Pos;
use Illuminate\Database\Eloquent\Model;
class ReceiptDetail extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'kasticket_';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'ticketnr';
/**
* Get pos.
*/
public function pos()
{
return $this->belongsTo(Pos::class, 'kassa_id', 'code');
}
}
Поз:
<?php
namespace App;
use App\ReceiptDetail;
use Illuminate\Database\Eloquent\Model;
class Pos extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'kassa';
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'code';
/**
* Get the receipt details.
*/
public function receiptDetails()
{
return $this->hasMany(ReceiptDetail::class, 'kassa_id', 'code');
}
}
В результате это дает значение null, а не модель Pos. В журнале запросов я вижу, что он загружается с нетерпением:
$receipts = \App\ReceiptDetail::with('pos')->get();
foreach ($receipts as $receipt) {
dd($receipt->pos);
}
Это дает мне ожидаемую модель Pos, но был сделан дополнительный запрос к БД:
$receipts = \App\ReceiptDetail::with('pos')->get();
foreach ($receipts as $receipt) {
dd($receipt->pos()->first());
}
Из журнала запросов я вижу следующее:
select * from `kasticket`
select * from `kassa` where `kassa`.`code` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Таблица ReceiptDetail должна иметь pos_id в соответствии с тем, как вы установили это отношение. Вместо dd используйте dump и посмотрите результат для всех $receipts, которые вы выбрали. Может быть, у первого действительно pos_id нулевой.
@DsRaj, это правильно
@RubenColpaert добавьте схему таблицы в свой вопрос
Я добавил некоторую информацию. Работа с устаревшими таблицами, что делает ее некрасивой, но, я думаю, это должно помочь.






Если вы не следуете правильному имени в первичном и внешнем ключах, вам необходимо правильно добавить отношения.
Измените так:
public function pos()
{
return $this->belongsTo(Pos::class,'foreign_key', 'local_key');
}
Модель POS
public function receiptDetails()
{
return $this->hasMany(ReceiptDetail::class,'foreign_key', 'local_key');
}
В этом случае журнал запросов дает ожидаемый результат. Кроме того, я попытался поменяться местами, чтобы быть уверенным, но это дает мне только ожидаемые ошибки, поскольку Laravel ищет несуществующие столбцы.
Все это в оригинальном посте. Если я чего-то не упускаю?
Уникальные идентификаторы таблиц (kasticket_.kassa_id и kassa.code) представляют собой строки в БД. Мне пришлось добавить следующую строку в класс Pos:
/**
* Indicates if the IDs are auto-incrementing.
*
* @var bool
*/
public $incrementing = false;
ReceiptDetail имеет одну запись pos (), верно?