В ларе eloquent куча разных крутых приблуд для использования связей. Но я очень давно мучаюсь с более сложными (а вроде и простыми) связями, используя именно эти приблуды.
К примеру, как реализовать связь One-to-One through One (or pivot), что бы эта связь работала нормально через ->with('relation')
или ->whereHas('relation')
?
Текущий мой код, который работает не в полный функционал Eloquent:
<?php
class User
{
/**
* User Jobs
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function jobs()
{
return $this->hasMany(Job::class, 'client_id');
}
/**
* User Bids
*
* @return mixed
*/
public function bids()
{
return $this->hasMany(Bid::class, 'writer_id')->with('job');
}
}
class Bid
{
/**
* Job relation
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function job()
{
return $this->belongsTo(Job::class)->withTrashed();
}
/**
* User writer relation
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function writer()
{
return $this->belongsTo(User::class, 'writer_id');
}
/**
* User writer relation (alias)
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function user()
{
return $this->writer();
}
}
class Job
{
/**
* Bids relation
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function bids()
{
return $this->hasMany(Bid::class);
}
/**
* User owner relation (alias)
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function user()
{
return $this->client();
}
/**
* User owner relation
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function client()
{
return $this->belongsTo(User::class, 'client_id');
}
/**
* Won bid relation
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function wonBid()
{
return $this->hasOne(Bid::class)->whereNotNull('accepted_at');
}
/**
* User winner model
*
* @return \App\Models\User|null
*/
public function getWinnerAttribute()
{
return $this->wonBid ? $this->wonBid->writer : null;
}
}
У заказчика(User) есть работы (Jobs)
У выполнителья(User) есть ставки (Bids)
У работы(Jobs) есть ставки(Bids), и одна победившая ставка(Bids) у которой не пустой accepted_at
Так вот, как достучаться до выполнителя при помощи eloquent? что-то вроде App\Models\Jobs::whereHas('winner')->get()
Были варианты:
<?php
public function winner()
{
$related = User::class;
$foreignKey = 'id';
$localKey = 'job_id';
$relation = 'winner';
/** @var \App\Models\User $instance */
$instance = $this->newRelatedInstance($related);
$builder = $instance->setTable('users')->newQuery()
->selectRaw('users.id')
->rightJoin(
DB::raw("
(select
`bids`.`accepted_at`,
`bids`.`writer_id`,
`bids`.`job_id`,
`bids`.`id`
from `bids`
where `bids`.`accepted_at` is not null) `bids`
"), 'users.id', '=', 'bids.writer_id'
);
$foreignKey = $foreignKey ?: $this->getForeignKey();
$localKey = $localKey ?: $this->getKeyName();
return (new BelongsTo($builder, $this, $foreignKey, $localKey, $relation))
->from('users');
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите пожалуйста, как вывести в заголовок таксономию по текущему urlВ данный момент выводит название категории /product-category/kompressory-standart/...
Есть таблица tbl_uploads где хранятся пути к изображениям (рентгенам)Есть таблица priem где хранится записи приёма пациента
Доброго времени суток! Есть WEB приложение написанное на PHPВ нем реализовано что то вроде заказов