Cakephp3: Невозможно добавить условие в поисковом запросе с ассоциацией hasmany - PullRequest
0 голосов
/ 04 сентября 2018

Я не могу передать условие в находке из ассоциации hasmany, возвращает ошибку столбца not found. Если я не пропущу никаких условий в таблице удобств для ресторана, он возвращает данные вместе с несколькими записями для ресторана. Пожалуйста, проверьте следующий код и дайте мне знать, где проблема. Я приложил сущности, модель и код контроллера. Все остальные вещи работают здесь.

Организация: Рестораны

class Restaurant extends Entity
{
    protected $_accessible = [
        'user_id' => true,
        'name' => true,
        'image' => true,
        'description' => true,
        'created' => true,
        'modified' => true,
        'user' => true,
        'restaurant_amenities'=>true
    ];
}

Ресторан EntityАудитория

class RestaurantAmenities extends Entity
{
    protected $_accessible = [
        'restaurant_id' => true,
        'amenity_id' => true,
        'created' => true,
        'modified' => true,
        'restaurants' => true
    ];
}

Столик: Ресторанный столик

public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('restaurants');
        $this->setDisplayField('name');
        $this->setPrimaryKey('id');

        $this->addBehavior('Timestamp');

        $this->belongsTo('Users', [
            'foreignKey' => 'user_id',
            'joinType' => 'INNER'
        ]);
        $this->hasMany('RestaurantAmenities', [
            'className' => 'restaurant_amenities',
            'foreignKey' => 'restaurant_id'
        ])->setJoinType('INNER')->setDependent(true);

    }

Таблица удобств ресторана

public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('restaurant_amenities');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');

        $this->addBehavior('Timestamp');

        $this->belongsTo('Amenities', [
            'foreignKey' => 'amenity_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Restaurants', [
            'foreignKey' => 'restaurant_id',
            'joinType' => 'INNER'
        ]);

    }

Найти запрос на RestaurantsController

$distanceField = '(3959 * acos (cos ( radians(:latitude) )
                    * cos( radians( Restaurants.latitude ) )
                    * cos( radians( Restaurants.longitude )
                    - radians(:longitude) )
                    + sin ( radians(:latitude) )
                    * sin( radians( Restaurants.latitude ) )))'; //* 1.60934
            $amenities = [2,3];
            $restaurants = $this->Restaurants->find()
                    ->select(['Restaurants.id','Restaurants.name','Restaurants.image','Restaurants.avg_rating','Restaurants.starting_price','Cuisines.name','RestaurantAmenities.amenity_id',
                        'distance' => $distanceField
                    ]) ->having(["distance < " => $distance])
                    ->bind(':latitude', $latitiude, 'float')
                    ->bind(':longitude', $longitude, 'float')
                    ->contain(['RestaurantAmenities'=>function($query) use($amenities){
                         return $query->select(['amenity_id'])
                        ->where(['RestaurantAmenities.amenity_id IN' => $amenities]);    

                        },'Users'=>function($q){
                            return $q->where(['Users.status'=>true]);
                        }])
                    ->where($conditions)->toArray();

Возвращает столбец не найден Ошибка, так как столбец существует в таблице:

{ "message": "SQLSTATE[42S22]: Column not found: 1054 Unknown column \u0027RestaurantAmenities.amenity_id\u0027 in \u0027field list\u0027", "url": "\/api\/restaurants\/filter.json", "code": 500, "file": "\/home\/simerjit\/public_html\/supperout\/vendor\/cakephp\/cakephp\/src\/Database\/Statement\/MysqlStatement.php", "line": 39 }
...