Nano Hash - криптовалюты, майнинг, программирование

CakePHP показывает все книги, автора которых нет в таблице авторов

Кажется, я не могу понять модель CakePHP ORM...

У меня есть таблица авторов (с Author.ID) и список книг (с Book.AuthorID) - многие книги имеют AuthorID, которого нет в таблице авторов (это по дизайну и ожидается)

По статистическим причинам я хотел бы перечислить все книги, у которых есть AuthorID, а AuthorID не найден в таблице авторов.

Я мог бы загрузить все книги в память и найти идентификатор вручную, но книг ~ 4000. Я хотел бы сделать это способом ORM (левое внешнее соединение?)

Спасибо, МС


  • Итак, ваш вопрос заключается в том, как определить левое соединение с помощью конструктора запросов CakePHP, или вы спрашиваете, следует ли вам использовать левое соединение в первом месте? 05.04.2017
  • Я думаю, что этот вопрос тоже может быть полезен 05.04.2017

Ответы:


1

Это довольно простая задача с помощью orm. Как упоминалось в комментариях @ndm, вы можете сделать это с помощью левого соединения, которое используется по умолчанию для ассоциации ownTo.

В BooksTable убедитесь, что ассоциация добавлена ​​в методе инициализации:

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

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

    $this->belongsTo('Authors', [
        'foreignKey' => 'author_id'
    ]);
 }

В вашем контроллере Books (если это контроллер, в котором вы делаете что-то):

$books_without_authors = $this->Books
             ->find()
             ->contain(['Authors'])
             ->where(['Authors.id IS NULL'])
             ->all();

$books_with_authors = $this->Books
             ->find()
             ->contain(['Authors'])
             ->where(['Authors.id IS NOT NULL'])
             ->all();

Если вы собираетесь делать это с нескольких контроллеров, то СУХОЙ способ сделать это - это ассоциация:

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

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

    $this->belongsTo('Authors', [
        'foreignKey' => 'author_id'
    ]);
    $this->belongsTo('WithAuthors', [
        'className' => 'Authors',
        'foreignKey' => 'author_id',
        'joinType' => 'INNER'
    ]);
    $this->belongsTo('WithoutAuthors', [
        'className' => 'Authors',
        'foreignKey' => 'author_id',
        'conditions' => ['Authors.id IS NULL']
    ]);
 }

Затем вы можете вызвать их в своем контроллере

$with_authors = $this->Books
   ->find()
   ->contains(['WithAuthors'])
   ->all();

$without_authors = $this->Books
   ->find()
   ->contains(['WithoutAuthors'])
   ->all();
05.04.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..