поиск по нескольким таблицам - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть 3 модели в Laravel: Contracter, Contractor_Areas & Contractor_Trade_Type

. Contractor может иметь типы торговли (сантехника, электричество и т. Д.) И области, где они работают по почтовому индексу.

Так что мне нужно выбрать все contractors с определенными trade и postcode.

Так что код должен сделать что-то вроде следующего для Contractor_Trade_Type id (16 в данном случае) и почтовый индекс SS здесь и укажите подходящих подрядчиков для идентификатора и почтового индекса.

Но там написано:

столбец trade_type_id не найден

$con = App\Contractor::with('Contractor_Trade_Types')->where('trade_type_id' , 16 )->with( 'contractor_areas' )->where('contractor_areas.postcode','ss')->first();
print_r( $con );

Модели следующие:

class Contractor  extends Model
{
    protected $table = 'Contractors';

    public $id;
    public $company;
    public $contact;
    public $landline;
    public $mobile;
    public $email;
    public $website;
    public $area;
    public $rate;
    public $address;
    public $gas_safe_reg_no;
    public $banned;
    public $ace_trades;
    public $created_at;
    public $updated_at;


    /*
        MODEL RELATIONSHIPS!!
    */
    // define one-to-one relationship between Contractors AND User
    public function user()  {
            return $this->belongsTo('App\User');
    }
    // Contractor connects on one-to-many with Contractor_Trade_Types.
    public function Contractor_Trade_Types()  {
            return $this->hasMany( 'App\Contractor_Trade_Types' );
    }   
    // Contractor connects on one-to-many with Contractor_Areas.
    public function Contractor_Areas()  {
            return $this->hasMany( 'App\Contractor_Areas' );
    }




    /**
    *       Get the trade types for a contractor.
    *       some contractors have more than one trade
    *       e.g. building and carpentry.
    */
    public function comments()  {
            return $this->hasMany('App\Contractor_Trade_Types');
    }


}




namespace App;

use Illuminate\Database\Eloquent\Model;



class Contractor_Trade_Types  extends Model
{
    protected $table = 'Contractor_Trade_Types';

    public $contractor_id;
    public $trade_id;


    // define relationship between Contractor_Trade_Types AND Contractor
    public function Contractor()    {
            return $this->belongsTo(' App\Contractor');
    }   



}


namespace App;

use Illuminate\Database\Eloquent\Model;



class Contractor_Areas  extends Model
{
    protected $table = 'Contractor_Areas';

    public $contractor_id;
    public $postcode;


    // define relationship between Contractor_Areas  AND Contractor
    public function Contractor()    {
            return $this->belongsTo(' App\Contractor');
    }   



}

1 Ответ

0 голосов
/ 19 сентября 2018

Из того, что я вижу, вы пытаетесь объединить предложения with() и where() для поиска в отношениях.

Вы можете добавить подзапросы, используя closure в с () метод запроса:

$con = App\Contractor::with(['contractor_trade_types' => function ($query) {
        $query->where('id', 16);
    }])
    ->with(['contractor_areas' => function($query) {
        $query->where('id', $area_id);
    }])
    ->first();

print_r($con);

Кроме того, эти проверки могут быть добавлены в область запроса для использования в вашем приложении:

$con = App\Contractor::withTradeType(16)->withArea('ss')->first();

Модель подрядчика (например, App \ Contractor.php)

public function scopeWithTradeType($query, $trade_type_id)
{
    return $query->with(['contractor_trade_types' => function ($q) {
        $q->where('id', $trade_type_id);
    }]);
}

public function scopeWithArea($query, $area_id)
{
    return $query->with(['contractor_areas' => function($q) {
        $q->where('id', 'ss');
    }]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...