Laravel relation One to One through One (or pivot)

332
05 июля 2017, 00:01

В ларе 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');
}
READ ALSO
Вывод таксономии по url

Вывод таксономии по url

Подскажите пожалуйста, как вывести в заголовок таксономию по текущему urlВ данный момент выводит название категории /product-category/kompressory-standart/...

277
Вывести ссылку если есть запись в таблице

Вывести ссылку если есть запись в таблице

Есть таблица tbl_uploads где хранятся пути к изображениям (рентгенам)Есть таблица priem где хранится записи приёма пациента

237
оповещения о изменении данных

оповещения о изменении данных

Доброго времени суток! Есть WEB приложение написанное на PHPВ нем реализовано что то вроде заказов

281