Laravel hasManyThrough эквивалент: принадлежит отношению к другой модели

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

Тем не менее, похоже, что метод applyToThrough (или hasOneThrough) отсутствует. Я уже пытался связать несколько методов belongsTo, но это не сработало (Call to undefined method Illuminate\Database\Query\Builder::belongsTo()). Любые идеи?

Вот пример моделей:

// The first model
// Schema: this model has a middle_id column in the database
class Origin extends Eloquent {
    public function middle()
    {
        return $this->belongsTo('Middle');
    }
}

// The second model
// Schema: this model has a target_id column in the database, but NOT an origin_id column
class Middle extends Eloquent {
    public function target()
    {
        return $this->belongsTo('Target');
    }
}

// The third model
class Target extends Eloquent {
}

Что бы я хотел сделать, добавьте что-то вроде следующего метода в модель Origin:

// A relationship method on the first "origin" model
public function target()
{
    // First argument is the target model, second argument is the middle "through" model, third argument is the database column in middle model that it uses to find the target model, or soemthing
    return $this->hasOneThrough('Target', 'Middle', 'target_id');
}

Чтобы я мог использовать $originInstance->target->title и т.д.

Ответ 1

public function target() { 
    $middle = $this->belongsTo('Middle','middle_id'); 
    return    $middle->getResults()->belongsTo('Target'); 
}

Ответ 2

Если это такая ситуация, как сообщение в бутылке, а бутылка принадлежит пользователю (user > bottle > message)

Единственный способ, которым я знаю, получить объект отношения:

// THIS IS IN App\Message

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

public function user()
{
    return $this->bottle->belongsTo('App\User');
}

Ответ 3

// First Model
public function secondModelRelation()
{
    return $this->belongsTo('App\Models\SecondModel');
}

public function thirdModelRelation()
{
    // Call the thirdModelRelation method found in the Second Model
    return $this->secondModelRelation->thirdModelRelation;
}


// Second Model
public function thirdModelRelation()
{
    return $this->belongsTo('App\Models\ThirdModel');
}


// Third Model

Ответ 4

Вы можете использовать hasOneThrough, но вам нужно настроить клавиши.

public function parent()
{
    return $this->hasOneThrough(Parent::class, Middle::class, 'id', 'id', 'middle_id', 'parent_id');
}

Происхождение принадлежит Середине, а Середина принадлежит Родителю. У средней потребности есть внешний ключ parent_id, а у источника есть внешний ключ middle_id.

Наконец, вы можете использовать:

Origin::find(1)->parent;