What can we use for exist query in magento2?
-
14-04-2021 - |
Frage
We have two approaches to find if the record exists in database or not
First
$select = $this->bookResource->getConnection()->select()
->distinct()
->from(
$this->bookResource->getMainTable(),
"author_id"
)
->where("author_id = ?", $authorId);
if ($this->bookResource->getConnection()->fetchOne($select)) {
//record exist
}
second
$bookCollection->addFieldToSelect('author_id')
->addFieldToFilter("author_id", $authorId);
if ($bookCollection->getSize()){
// record exist
}
which one to use and why
Lösung
I would use the first one but with a limit.
$select = $this->bookResource->getConnection()->select()
->distinct()
->from(
$this->bookResource->getMainTable(),
"author_id"
)
->where("author_id = ?", $authorId)
->limit(1);
This will run a query like SELECT DISTINCT(..) FROM ... WHERE author_id = ... LIMIT 1
.
Without the limit, if there are multiple rows matching your criteria, all will be retrieved from the db and one will be returned.
The second approach, with getSize
runs a query like SELECT COUNT(*) from ... where...
. it may run slow if you have a lot of records.
But if you want to respect the Law Of Demeter you can use a combination of the 2.
$bookCollection->addFieldToSelect('author_id')
->addFieldToFilter("author_id", $authorId)
->setPageSize(1)
->setCurPage(1);
$book = $bookCollection->getFisrtItem();
if ($book->getId()) {
//a row exists
} else {
//there is no row for the selected author.
}
Andere Tipps
class testIfExist
{
/**
* @var ResourceConnection
*/
private $resourceConnection;
/**
* @param ResourceConnection $resourceConnection
*/
public function __construct (
ResourceConnection $resourceConnection
) {
$this->resourceConnection = $resourceConnection;
}
/**
* @param string $pageId
* @return bool
*/
public function execute(string $id): bool
{
$connection = $this->resourceConnection->getConnection();
$tableName = $this->resourceConnection->getTableName('table-name-here');
$qry = $connection->select()
->from($tableName)
->where('entity_id_of_table = ?', $id);
return (bool)$connection->fetchOne($qry);
}
}
easy class to call
Cheers
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange